hot100滑动窗口无重复字符串
题目链接:
3. 无重复字符的最长子串 - 力扣(LeetCode)
题目的要求是让我们找到字符串中的最长字符串,这个很显然我们首先想到暴力解法,列举所有的字符串找到不重复的,我们在此思路上优化算法进行滑动窗口的优化。
首先先来一下暴力解法直接枚举所有的字符串:
先来枚举所有的子字符串然后利用map进行判断是否有重复字符串,进行长度的计算。
求得最大的len。显然结果超时。
int lengthOfLongestSubstring(string s) {vector<string> substrings;int n = s.length();for (int i = 0; i < n; i++) { // 起始位置for (int j = 1; j <= n - i; j++) { // 子串长度substrings.push_back(s.substr(i, j));}}int len=0;for(auto e:substrings){map<char,int>num;for(auto b:e){num[b]++;if(num[b]>1)break;else{len = max(len, (int)num.size());}}}return len;}
滑动窗口的基本思路是:
两个指针,利用下标访问用Int代替指针,开始的时候都指向开头,用map记录每个字符出现的次数当次数大于1时,我们进行计算一次长度,取最大长度,让left移动到窗口内无重复字符串吗,继续滑动。
细节问题:
这里有个细节问题是当我们的right滑出字符串时,我们会少计算一次长度,导致错误,所以我们每次结束之后计算一次最后的left位置到right为止的字符串长度即可。
下面给出滑动窗口的代码:
class Solution {
public:int lengthOfLongestSubstring(string s) {int left=0;int right=0;map<char,int>num;int len=0;for( right=0;right<s.size();right++){num[s[right]]++;//当map内某个字符出现次数大于1if(num[s[right]]>1){//计算一次长度len=max(len,right-left);//让left移动到窗口内无重复字符串while(s[left]!=s[right]){num[s[left]]--;left++;}num[s[left]]--;left++;}} len=max(len,right-left);if(len==0)len=s.size();return len;}
};