题目要求:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路:
刚开始的时候,我想采用unordered_set的方法来解决遇到重复字符,就去重的问题,然后剩下来的就是最长字符串,但是没有注意到这里要求的是子串,因为如果用了这种方法,就会造成被去重元素之前的元素不能被除去的问题,也就不能形成子串了
那怎样才能即把重复的字符去掉,还把子字符之前的字符也去掉呢,并且还要记录最长子串的大小,如何做到呢?
这里就用到了滑动窗口来解决,既可以去重,又可以记录子字符串的大小,我以字符串"pdvdf"为例子说明,怎么解决
大致思路:
对于滑动窗口来说,滑动窗口的大小是不断改变的,该窗口既有插入,又有删除,对于本题来说,如果插入的子字符与窗口的元素重复,那就更新窗口的左边界到窗口中冲突元素下标的下一个,还要记录窗口的大小,用于比较,这样就可以找出最大无重复元素的子字符串的长度了
代码:
class Solution {
public:
bool HasNum(int start, int end, string& s,int& val)
{
for(int i = start; i < end; i++)
{
if(s[end] == s[i])
{
val = i;
return true;
}
}
return false;
}
int lengthOfLongestSubstring(string s) {
int count = 0;
int res = 0;
int start = 0;
if(s.size() == 1) return 1;
for(int i = 0; i < s.size(); i++)
{
int num;
if(HasNum(start, i, s, num))
{
if(count > res)
{
res = count;
}
count++;
count = count - (num - start + 1);
start = num + 1;
}
else
{
count++;
}
}
if(count > res) res = count;
return res;
}
};