无重复字符的最长子串

文章介绍了如何使用滑动窗口算法解决力扣第三题,即找到给定字符串中不包含重复字符的最长子串的长度。通过两个指针,一个左指针i和一个右指针r,以及C++中的unordered_set容器来跟踪字符,动态维护无重复字符的子串并更新最大长度。
摘要由CSDN通过智能技术生成

来自力扣第三题

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

这里最容易想到的就是暴力算法--滑动窗口,这里很像数据结构中的字符串比较的KMP算法那里,也是利用了滑动窗口的方法。

这里主要的思想就是有两个指针,一个是左指针,一个右指针,中间的部分就是最长无重复子串,然后输出其长度即可。这里采用遍历来进行窗口的开端位置,是否有相等的元素(也就是是不是没有重复)需要用到C++中的无序的set容器来实现。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char>arr;
        int ans=0;
        int r=-1;
        int n=s.size();
        for(int i=0;i<n;i++)
        {
            if(i!=0)
            {
                arr.erase(s[i-1]);
            }
            while(r+1<n&&!arr.count(s[r+1]))
            {
                arr.insert(s[r+1]);
                r++;
            }
            ans=max(ans,r-i+1);
        }
        return ans;
    }
};

 ans作为最后输出的长度,i就是左指针,从数组s的最左边(也就是位置0)开始遍历到最后,这里总的想法就是在set容器中,左指针右移一次,删除一个元素,右指针右移一次加入一个元素(要判别是否重复)。

这里要注意的一点就是逻辑顺序,i从0开始到最后没什么好说的,有意思的是右指针r,我们要的是r的下一个元素,也就是r+1,如果r+1满足条件,那么就把这个r+1的元素放进来,然后右指针右移一次。也就是右指针右移一次加入一个元素。

最后就是在for循环结束的位置加入max来得到ans的最大值即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值