题目描述
找到一个串中最长的不重复的字串。这里的字串指的是相邻的串。
解题思路
滑动窗口法,使用两个指针(用 i
和 j
表示,一个指向子串的起始位置,另外一个指向子串的终止位置。初始设置两个指针都为 0 ,然后两个指针不断往后走,同时保留一个字典,记录他们之间的不重复的字符,更新规则为:
- 如果
j
处的字符没有在字典中出现过,说明加入它可以让子串的长度增加且没有重复的字符,此时j ++
- 如果
j
处的字符在字典中出现过,那么需要删除从指针i
开始寻找,直到寻找到指针j
处对应的元素的重复元素为止。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int i = 0, j = 0;
int max_length = 0;
unordered_map<char, bool> found;
while(i <= j && j < s.size()){
if (!found.count(s[j])){
found[s[j]] = true;
max_length = max(max_length, j - i + 1);
j ++;
}else{
while(s[i] != s[j]){
found.erase(s[i]);
i ++;
}
i ++;
j ++;
}
}
return max_length;
}
};