首先,没有第二题,没有第二题的原因是,javascript中根本就没有那种数据结构,尽管我在playground里面调试出了正确的结果,但是也许是因为数据结构问题,最终没能让我通过。
所以我就抛弃第二题了。
Given a string, find the length of the longest substring without repeating characters.
给定一个字符串,找出不含有重复字符的 最长子串 的长度。
例如:
Given "abcabcbb"
, the answer is "abc"
, which the length is 3.
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
Given "bbbbb"
, the answer is "b"
, with the length of 1.
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
Given "pwwkew"
, the answer is "wke"
, with the length of 3. Note that the answer must be a substring, "pwke"
is a subsequence and not a substring.
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
题目里面有几个点需要注意,首先就是没有重复字符,一开始我没看到,吃了好大的亏。然后就是找到的这个字符串得是给定字符串的子串。
下面贴出代码,然后分析一下代码:
1 var lengthOfLongestSubstring = function(s) { 2 var i, j; 3 var len = s.length; 4 var compareNumber = 0; 5 for (i = 0; i < len - 1; i++) { 6 for (j = i + 1; j < len; j++) { 7 if (s[i] === s[j]) { 8 compareNumber = s.slice(i, j).length > compareNumber ? s.slice(i, j).length : compareNumber; 9 break; 10 } 11 } 12 } 13 if (compareNumber === 0) { 14 compareNumber = len; 15 } 16 return compareNumber; 17 };
这题不难,关键判断条件是遇到第一个相同的字母,则停下。然后判断新找到子串的长度与之前的最长长度哪一个长,然后令compareNumber等于更长的那个长度。
同时,在取得更长长度之后,退出本轮循环,进行下一轮循环。防止出现字符重复的情况。
最后加了一个if语句,单独判断一次输入字符串为空的情况。
总的来说,只能算是一种行之有效,略微粗暴的方式,并不是本题的最优解。