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

本文介绍了一种利用滑动窗口方法解决寻找字符串中最长无重复字符子串的问题。通过动态调整窗口左右边界并结合集合数据结构来高效地实现算法。适用于多种编程语言如 Python 和 C++。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 思路:

代码


 思路:

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

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

遍历整个字符串,判断字符是否在集合里面,若不在集合里面,将字符放入集合,滑动窗口的大小要增加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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值