题目的意思是找出给出字符串的不重复字串的最大值。最开始,我的想法是,用ES6里的Set结构,因为它可以去掉数组中的重复项,然后,如果去掉后的数组和原来的数组长度不同,那么说明有了重复项。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function (s) {
var length = 0
var max = 0
var lost // 剩余长度
if (s == '') {
return 0
} else {
var aStr = s.split('') // 把字符串换成数组,方便比较
for (let i = 0; i <= aStr.length; i++) {
lost = aStr.length - i
if (lost < max) {
return max
break
}
for (let j = i + 1; j <= aStr.length; j++) {
// 原始长度
let l1 = aStr.slice(i, j).length
// 去掉重复值以后的长度,这里set的长度用size
let l2 = (new Set(aStr.slice(i, j))).size
if (l1 == l2) {
length = j - i
if (length > max) {
max = length
}
continue
} else {
break
}
}
}
}
};
这里遇到的问题是,针对非常非常的长的字符串,会超时。。。。。
参考了一个答案,用的方法是滑动窗口算法,就是说,确保窗口里没重复的,往后走,有重复的移动左边的,没问题移动右边的。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var max = 0, l = 0, r, i
if(s.length < 2) return s.length
for(r = 1; r < s.length; r++) {
// 大于0说明有重复的,r-1的意思是从r-1到0位,检查是否有和最右边的有重复的。如果有,i》0
i = s.lastIndexOf(s[r], r - 1)
if(i >= 0) {
max = Math.max(max, r - l)
// 移动左边到应该到的位置
l = Math.max(l, i + 1)
}
}
return Math.max(r - l, max)
};
网友评论