给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
设计到子串的问题,首先想到用双指针解题。分析本题,用滑动窗口求解比较合适。(题做多了,看多了自然就知道了),等后续把相关题目做完,再总结滑动窗口一类题的求解规律。
①根据题目先出滑动窗口的基本框架
②分析窗口滑动的条件,由于是找无重复的子串,所以windows[d]>1即为条件
完整代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> windows;
int left=0;
int right=0;
int res=0;
while(right < s.size())
{
char c = s[right];
right++;
windows[c]++;
//判断左侧窗口是否要收缩
while(windows[c]>1)
{
char d = s[left];
left++;
windows[d]--;
}
res = max(res, right-left);
}
return res;
}
};