【力扣】3. 无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣(LeetCode)

本题主要使用滑动窗口算法,定义左指针lp, 右指针rp,将字符串作为数组处理就好。

滑动窗口主要由两个循环组成,若未满足条件则将右指针向右移,满足条件则左指针向右移。

本题的条件为窗口中是否有重复的字符。

一般来说,滑动窗口的基本模版是这样的:

 while (右指针移动范围)
    {
       
        while (满足条件)
        {
            //数据操作
            //左指针右移
        }
        //数据操作
        //右指针右移
	}

 本题哈希表仅作为数据存储的容器。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() == 0) return 0;    //判空
        unordered_set<char> map;    //力扣这里如果用unordered_map定义哈希表insert会出现问题
                                    //反正我是这样的:-(
        int sum = 0;              //最后的结果存在这里
        int lp = 0, rp = 0;       //定义左右指针
        for(; rp < s.size(); rp++){    //滑动窗口,条件:存在相同字符
            while(map.find(s[rp]) != map.end()){    //先判断哈希表中是否存入了相同字符,
                                                    //否则会出现自己找到自己的情况
                map.erase(s[lp]);                   //若找到相同字符则删掉哈希表中key = lp的值
                lp++;                               //左指针右移
            }
            map.insert(s[rp]);                      //向哈希表中填入元素
            sum = max(sum, rp - lp + 1);           //判断结果,位数从零开始算所以最后结果要加一
        }      
        return sum;  
    }
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值