3. 无重复字符的最长子串(滑动窗口)
思路
分解题意,我们需要找没有重复字符的最长字串,那我们会遇到什么问题,就是当我们遇到了重复字符的时候怎么处理,我们来讨论,围绕最长。当我们遇到一个重复的字符,说明我们要记录前面的字串长度,并且寻找下一个字串,那么现在问题变成,怎么找下一个字串,我们有的唯一的条件就是那个重复的字符,那是不是把前面这个重复字符删掉就行了,或者从前面这个重复的字符后面开始找。
例如
abcdefgaoplu;
这个字符串明显的我们只要把最开始的重复的字符串删掉就行。
abcdefgcoplu
这个字符串明显就是要把重复字符串前面的字符都删掉才行,那么我们是不是找到解决方法。
实现
我们可以设置两个标记变量,通常称为指针。
int i=0;
int j=0;
j不断向右移动,添加字符到一个容器里面。这个容器需要可以判断重复字符,那么我们使用哈希表map容器,map<char,int> mp;前面是字符后面是坐标。但是我们发现需要删除重复字符前面所有的字符,而且map删除元素需要键来判断,我们使用unordered_set<char> mp容器进行删除元素.每次删除开头元素,判断重复元素还存在没有。
while(i<j&&mp.count(s[i])!=0)
{
mp.easer(s[i]);
i++;
}
i表示删到重复元素的位置.
代码
class Solution {
public:int lengthOfLongestSubstring(string s) {unordered_set<char> mp;int i=0;//左指针int maxx=0;for(int j=0;j<s.size();j++){while(i<j&&mp.count(s[j])!=0){mp.erase(s[i]);i++;}mp.insert(s[j]);maxx=max(maxx,j-i+1);}return maxx;}
};