给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
思路:
1、先判断这个字符串的长度,如果长度小于2,那它的最长无重复子串就是其长度。
2、定义一个哈希表,用来存放字符串s中每个字符的哈希值。
3、定义两个指针,left和right,用来寻找不重复的子串。
4、定义res,用来记录最长无重复子串的长度。
5、left指向该无重复子串左边的起始位置,遍历整个字符串,对于每一个遍历到的字符,如果哈希表中该字符串对应的值为0,说明没有遇到过该字符,则此时计算最长无重复子串,res = right - left 。最后每次都要在哈希表中将当前字符对应的值赋值为right。然后right自加
这个140ms
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
if(s.length < 2) return s.length;
let hash = {},
res = 0,
right = 0,
left = 0;
while (right < s.length) {
if (hash[s[right]] >= left) {
if (right - left > res) {
res = right - left;
}
left = hash[s[right]] + 1;
}
hash[s[right]] = right++;
}
return Math.max(res, right-left);
};
一个新的方法
/**
* @param {string} s
* @return {number}
*/
const lengthOfLongestSubstring = s => {
if (!s.length) return 0;
let res = 1,
flag = 0;
for (let i = 0; i < s.length; i++) {
let index = s.indexOf(s[i], flag);
if (index !== -1 && index < i) flag = index + 1;
res = Math.max(res, i - flag + 1);
}
return res;
};