题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
思路
主要是利用滑窗的思想。
解法
ES5的方法:
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
var str = "";
var len = 0;
for(var i=0;i<s.length;i++){
if(str.indexOf(s[i])==-1){
str = str+s[i];
}else{
//因为后面会有删去字符的操作,故在这步就要统计字符的长度
if(str.length>len){
len = str.length;
}
while(str.indexOf(s[i])!=-1){
//去掉组成字符串的第一个字符,直到不含有下一个字符为止
str = str.slice(1);
}
str = str+s[i];
}
if(str.length>len){
len = str.length;
}
}
return len;
};
ES6的方法:
var lengthOfLongestSubstring = function(s) {
var set = new Set();
var maxlen = 0;
//因为set的delete方法不能按照索引删去第一个字符?只能删去对应的值?
//所以这里把j当成一个指针,s[j]可得要删去的字符
var j = 0
for(let i=0;i<s.length;i++){
if(!set.has(s[i])){
set.add(s[i])
}else{
maxlen = set.size>maxlen?set.size:maxlen
while(set.has(s[i])){
set.delete(s[j])
j++
}
set.add(s[i])
}
maxlen = set.size>maxlen?set.size:maxlen
}
return maxlen
};