给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1: 输入: s = "abcabcbb" 输出: 3
解释: 因为无重复字符的最长子串是"abc",所以其长度为 3
示例 2: 输入: s = "bbbbb" 输出: 1
解释: 因为无重复字符的最长子串是"b",所以其长度为 1
滑动窗口
思路:枚举左端点,尽可能地扩展右端点,当出现重复字符导致区间不合法时,缩减左端点直到区间合法。时间复杂度:O(n)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.length();//字符串长度
int l=0;//左指针
int ret=0;//滑动窗口最大值
unordered_map<char,int> count;存储字符出现次数的哈希表,使用map也可以
for(int r=0;r<n;r++){
count[s[r]]++;//右指针向右移动,对应字符计数器+1
while(count[s[r]]>=2){//当前所指的字符出现次数大于1次
count[s[l++]]--;//左指针右移,对应字符计数器-1,直到将刚才重复的字符滑出窗口
}
ret=max(ret,r-l+1);//若此时滑动窗口值为最大,更新ret
}
return ret;
}
};