题目描述:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
题目样例:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
思路:
滑动窗口的思想,先把窗口扩充到最大(右指针指向的字符在窗口出现过),然后计算窗口大小,滑动左指针;
代码实现:
int lengthOfLongestSubstring(string s) {
unordered_set<char> uset;
int cnt = 0;//每次计算滑动窗口的值
int res = 0;//计算返回的值 通过max(res,cnt)获取
for(int i=0,j=0;i<s.size();i++){
//第一步扩充滑动窗口
while(j<s.size() && !uset.count(s[j])){
//窗口里面没有当前指向就添加进窗口
uset.insert(s[j++]);
cnt++;
}
//更新最大值
res = max(res,cnt);
if(j == s.size()) break;
//收缩窗口左指针
uset.erase(s[i]);
cnt--;
}
return res;
}