无重复字符的最长子串【滑动窗口】

题目链接

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

解题思路:

因为是无重复的最长子串,很显然是滑动窗口

用left,right维护窗口的左边界和右边界

用map判断是否存在重复

因为我用下标为1开始,易于维护

所以left=right=1;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 1;
        int right = 1;//滑动窗口从1开始,此时表示第一个数
        int Max = 0;
        map<int, int>mp;
        if (s == "")
            return Max;
        for (int i = 0; i < s.length(); i++) {
            if (mp[s[i]] == 0) {//不重复
                mp[s[i]] = i + 1;//把该值的下标加1存入
                right = i + 1;
            }
            else {//重复了
                Max = max(Max, right - left + 1);//先进行结算
                for (int j = left-1; j < mp[s[i]]-1; j++) {//将左边界到重复的数的下标全部移除
                    mp[s[j]] = 0;
                }
                left = mp[s[i]] + 1;
                right = i + 1;//维护左右边界
                mp[s[i]] = i + 1;//将该数的下标加1存入
            }
        }
        Max = max(Max, right - left + 1);
        return Max;
    }
};
posted @ 2022-01-22 17:36  夜灯长明  阅读(31)  评论(0编辑  收藏  举报