目录
思路:
使用滑动窗口的方法处理。滑动窗口就是一个窗口,窗口里面是符合条件的字符串,这里的条件是字符不重复,求最长的子串就是求滑动窗口的最大的长度。
不重复:可以将字符保存到集合里面。
遍历整个字符串,判断字符是否在集合里面,若不在集合里面,将字符放入集合,滑动窗口的大小要增加1,若在集合里面,就要将滑动窗口左边的字符去掉一个,再判断当前字符是否在集合中,若在集合中,继续从滑动窗口的左边拿掉一个字符(滑动窗口长度-1)。
代码
python
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
maxLen,idx = 0,0 #维护一个下标,通过下标从滑动窗口左边删除字符
seen = set()
for ch in s:
while ch in seen:
seen.remove(s[idx])
idx += 1
seen.add(ch)
maxLen = max(maxLen,len(seen))
return maxLen
c++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//边界
if (s.empty()) return 0;
int maxLen = 0,curLen = 0,idx = 0;
unordered_set<char> seen;
for (char& ch : s){
// curLen++;
// std::unordered_set<char>::iterator it = seen.find(ch); //迭代器这里不能用,因为迭代器的赋值不在循环里面
while (seen.find(ch) != seen.end()){
seen.erase(s[idx]);
idx++;
// curLen--;
}
seen.insert(ch);
curLen = seen.size(); //可以维护一个当前字符长度的变量curLen,也可以最后计算滑动窗口的长度,内存上面差距不大
maxLen = max(maxLen,curLen);
}
return maxLen;
}
};
版权声明:本文为weixin_51449137原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。