给定一个字符串 s
,请你找出其中不含有重复字符的 最长
子串
的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
滑动窗口法,使用一个哈希集合unordered_set,来记录目前子串里存在的字符,当右指针要向右移动时,判断新的字符是否已经存在于哈希集合中,不存在即可加入,并且继续右移(在rk<n-1)时。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set <char> occ;
int rk = -1, ans = 0;
int n = s.size();
for(int i = 0; i < n; i++){
if(i!=0){
occ.erase(s[i-1]);
}
while(rk+1<n && !occ.count(s[rk+1])){
occ.insert(s[rk+1]);
rk++;
}
ans = max(ans, rk-i+1);
}
return ans;
}
};