3 Longest Substring Without Repeating Characters
最长的没有重复的连续子串
题目描述
在字符串中间寻找最长的没有重复元素的字串,
如: 对于asdac
结果是 sdac
思路
维持一个滑动窗口
建立头指针,尾指针,分别表示窗口的开始和结束位置。
从字符串头部开始。
将尾指针前移,把当前尾指针指向的元素加入窗口,如果尾指针遇到在窗口中重复出现的元素,则把头指针移动到该元素在窗口中上一次位置加一的位置。
然后维护maxlen变量,比较当前头尾之差与maxlen的差别更新maxlen。
继续推进尾指针直到结束。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int start, end, length, maxLength, templength;
start = 0;
end = 0;
length = s.length();
maxLength = 0;
map<char, bool> hash; // 用一个char到bool的映射保存当前窗口内部的字符
while (end != length) {
// 找到当前元素是否出现过,且状态为true表示在窗口中
if (hash.find(s[end]) != hash.end() && hash.find(s[end])->second != false) {
// 要把start滑动到与当前元素相同的元素的后一位
while (s[start] != s[end]) {
hash[s[start]] = false; // 随着头指针移动要把其指向的元素从窗口中移除
start++; // 滑动start
}
hash[s[start]] = false;
start++;
}
// 记录当前长度
templength = end - start + 1;
maxLength = maxLength < templength ? templength : maxLength;
// 将当前长度对应的头尾位置加入记录
hash[s[end]] = true;
// end继续后移
end++;
}
return maxLength;
}
};