题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长连续子字符串 的长度。
示例 1:
代码语言:javascript复制输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子字符串是 "abc",所以其长度为 3。
示例 2:
代码语言:javascript复制输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子字符串是 "b",所以其长度为 1。
示例 3:
代码语言:javascript复制输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
代码语言:javascript复制输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
思路分析
知识点:滑动窗口
解析:
这也是一道经典的滑动窗口题,事实上滑动窗口模板是非常固定的,无非就是进窗口出窗口,然后判断条件,更新结果,每一道题的不同点都是在这四个方面。
1.首先如何判断我们取得的字串内有重复字符,利用哈希表,将每一个进窗口的字符进入哈希表,每当新字符进入时就判断一下哈希表上对应的值是否存在。
2.如果存在的话,此时就要出窗口,将left不断右移,每右移一个,就将对应字符的哈希表减1,直到重复字符的哈希表值为1即可。
3.此时更新结果。
代码语言:javascript复制class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left=0,right=0,n=s.size(),len=0;
int hash[128]={0};
while(right<n)
{
hash[s[right]] ;
while(hash[s[right]]>1)
{
hash[s[left ]]--;
}
len=max(len,right-left 1);
right ;
}
return len;
}
};