Leetcode 3. 无重复字符的最长子串 滑动窗口 2024重做

原题链接:Leetcode 3. 无重复字符的最长子串
这道题之前写过一次:Leetcode 3. 无重复字符的最长子串 滑动窗口,怎么说呢,自己都看不懂的程度
现在是2024.8.16重做这道题
解法1: 使用左右指针,左指针先定住,右指针向右滑动,窗口内的字符串表示无重复字符的字符串,每个字符用一个map容器标记是否已经出现过,如果出现过,标记mp[s[r]]=1,如果当前右指针处的字符已经出现过了,那么将左指针右移,直到重复字符第一次出现处的后一个位置,移动过程中将所有字符在map容器中的状态清空。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int res = 0;
        int l = 0, r = 0;
        map<char, int> mp;
        while (l <= r && r < s.size()) {
            if (!mp[s[r]]) {
                mp[s[r++]] = 1;
                res = max(res, r - l);
            } else {
                while (s[l] != s[r]) {
                    mp[s[l]] = 0;
                    l++;
                }
                mp[s[l]] = 0;
                l++;
            }
        }
        return res;
    }
};

解法二: 将解法一中记录某个字符是否出现过(mp[ch]=1),改过记录它上一次出现的位置(mp[ch]=i+1),以此取消左指针的右向逐步移动,而是直接将左指针定位到重复元素上一次出现的位置mp[ch]的下一个位置,这样改变之后,if (mp[s[i]] && mp[s[i]] < l)是灵魂。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int res = 0;
        int l = 0, r = 0;
        map<char, int> mp;
        for (int i = 0; i < s.size(); i++) {
            if (!mp[s[i]] || (mp[s[i]] && mp[s[i]] < l)) {
                mp[s[i]] = i + 1;
                res = max(res, i - l + 1);
            } else {
                l = mp[s[i]];
                mp[s[i]] = i + 1;
            }
        }
        return res;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值