一、题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
二、题目解析
算法思想:移动窗口的思想去解决。
那为什么要用这个方法解决呢?
我们首先用暴力的思路去遍历一遍,我们遍历到deabc后,出现了第一个重复字符a,如果此时左指针直向后移动一位,然后右指针继续从左指针的下一位慢慢遍历,会重蹈覆辙。
因此我们发现这样的一个规律:那就是当遍历出现重复字符时,再重新遍历,左指针应该从重复的字符下一位开始,这样就避免很多的重复操作。
这样左右指针都是向同一方向去遍历,符合我们的移动窗口的题目的条件,所以这时我们才回去采用移动窗口去解决!
下面就是利用移动窗口的思想去解决这道题。
- 让做右指针都为0
- 进窗口,让字符进入哈希表
- 判断窗口是否出现重复字符
- 更新最大值
三、原码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left = 0,right = 0;
int ret = 0;
//用数组实现简易的哈希表
int hash[128] ={0};
if(s.size() == 1)
return 1;
while(right < s.size())
{
hash[s[right]]++;
while(hash[s[right]] > 1)
{
hash[s[left++]]--;
}
ret = max(ret,right-left+1);
right++;
}
return ret;
}
};