【leetcode top100-medium】3.无重复的最长子串

  • Post author:
  • Post category:其他

目录

 思路:

代码


 思路:

使用滑动窗口的方法处理。滑动窗口就是一个窗口,窗口里面是符合条件的字符串,这里的条件是字符不重复,求最长的子串就是求滑动窗口的最大的长度。

不重复:可以将字符保存到集合里面。

遍历整个字符串,判断字符是否在集合里面,若不在集合里面,将字符放入集合,滑动窗口的大小要增加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 版权协议,转载请附上原文出处链接和本声明。