您的位置:首页 > Web前端 > JavaScript

【JavaScript】Leetcode 3.无重复字符的最长子串

2020-07-18 05:07 225 查看

题目描述

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例

示例 1:

输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

暴力思路

双指针遍历。存个临时字符串tempString,使用双指针i,j,从头开始,i不动,j往后移动,临时字符串逐个增加字符,一旦碰到和位置i字符重复的字符(判断方法是用indexof()),临时字符串清空,i往后移动一位,j重新从i后面开始移动。耗时328ms

var lengthOfLongestSubstring = function(s) {
if (s.length <=1){
return s.length;
}
let max = 0;
let tempString = s[0];
let i=0,j=1;
while(j<s.length){
if(tempString.indexOf(s[j])>=0){
max = max > (j-i)? max:(j-i);
i++;
j=i+1;
tempString =s[i];
continue;
}
tempString += s[j];
j++;
}
if(tempString.length>max){max = tempString.length;}
return max;
};
滑动窗口解法

看了官方题解,滑动窗口解法。也是双指针,左指针和右指针构造了一个滑动的窗口。每一轮将左指针向右移动一格,不断地向右移动右指针,直到遇到重复的字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串。

时间复杂度:O(N),其中 N 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。空间复杂度最多有O(128),128是字符集的长度

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/wu-zhong-fu-zi-fu-de-zui-chang-zi-chuan-by-leetc-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

var lengthOfLongestSubstring = function(s) {
if (s.length==0||s.length==1) return s.length;
let right=-1,ans=0;
let occ = new Set();
for(let left=0;left<s.length-1;left++){
if(left!=0){
occ.delete(s[left-1]);
}
for(;right<s.length;right++){
if(occ.has(s[right])){
break;
}
occ.add(s[right]);
}
ans = Math.max(ans,right-left);
}
return ans;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: