问题:给定一个字符串,请你找出个中不含有反复字符的 最宗子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
诠释: 由于无反复字符的最宗子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
诠释: 由于无反复字符的最宗子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
诠释: 由于无反复字符的最宗子串是 “wke”,所以其长度为 3。
请注意,你的答案必需是 子串 的长度,"pwke" 是一个子序列,不是子串。
解答:
1.暴力破解
var lengthOfLongestSubstring = function(s) {
var l = s.length;
var re = 0;
for (var i= 0; i < l; i++) { //1
for(var j = i + 1; j <= l; j++){ //2
if(check(i, j)) {
re = Math.max(re, j - i)
} else {
break
}
}
}
function check(start, end) {
var a = [];
for (var k = start; k < end; k++) { //3
if (a.indexOf(s[k]) !== -1) {
return false
} else {
a.push(s[k])
}
}
return true;
}
return re
};
上来就是一顿for轮回操纵,如许暴力写我们的leetcode肯定是不会给过的,由于碰到超级长的字符串测试用例,执行时候会超越时候限定,上面代码的优化空间很大。
理一下逻辑,我们每次在2内里检测出有反复的字符时,纪录这个反复字符前一次涌现的位置index,然后中缀此次轮回,最先下一次1的轮回,而且i的位置应当为index+1。
比方在i=0的时,在2轮回里j=4时就会涌现反复的字符d,字符d前一次涌现的位置是1,这时候最长字符串长度是4,而且被纪录,这时候应当最先1轮回的下一次轮回,而且是从i=2最先。
3轮回和2轮回实际上是不必要的,我们建立一个动态的字符串,把每次轮回到的字符加进去并及时纪录它的长度,碰到反复的字符串就砍掉字符第一次涌现跟它之前的字符串,比方上图,i轮回到4时,涌现反复字符d,d在之前涌现的位置是1,我们应当砍掉动态字符串位置1跟它之前的字符串,来保证它是无反复的字符串。代码以下
var lengthOfLongestSubstring = function(s) {
var l = s.length;
var re = 0;
var a = '', index;
for (var i = 0; i < l; i++) {
index = a.indexOf(s[i])
if (index !== -1) {
a = a.slice(index + 1)
}
a+=s[i]
re = Math.max(re, a.length);
}
return re
};
一下从矮穷挫变成高富帅,速率杠杠哒!