给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。(中等)
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
算法思路
1、本题我的思路是设置两个指针P1,P2,一开始都指向字符串头部,再另设一个集合,如下图所示
2、我们将红色指针指向的元素放入集合中,然后移动红色的指针,若集合中没有此元素,则重复此过程,结果如下所示
3、然后我们发现继续移动红色指针,发现元素不能放入集合中,整个时候,我们需要将集合中蓝色指针所指元素删除,然后再移动蓝色指针。
4、紧接着,我们发现可以继续移动红指针,则重复步骤2
5、之后就一直重复2、3过程,直到红指针遍历结束
最后返回值的问题记得在指针变化的时候适当保存一下就行。
代码 C++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result = 0,n = 0;
unordered_map map;//以map当作集合
auto i =s.begin();//设置两初始指针
auto j =s.begin();
while(i != s.end()){
if(map.find(*i) == map.end()){
map[*i] = 1;
n++;
i++;
}
else{
map.erase(*j);//移动前面指针时删除元素
j++;
n--;
}
if(n > result){
result = n;//n用于记录每一次结果
}
}
return result;
}
};



