3. 无重复字符的最长子串

数据量太大,显然不能用n方的算法

又只是子串,遍历一遍即可

遇到一个重复的字母,只有两个操作

1、以此字母为间隔,将下一个字母作为起点

2、从上一个此字母(就是重复字母)的下一个字母开始,到此字母连起来

显然,第2个操作带来的价值最大

因此需要记录起点

注意一点,如果一个字母重复了,但重复字母在起点之前,那是不用管的

class Solution {
public:
    map<char, int> vis;
    int lengthOfLongestSubstring(string s) {
        int length = s.length();
        int ret = 0, temp = 0, ss = 1;
        for(int i = 0; i < length; i++)
        {
            if(vis[s[i]] >= ss)
            {
                ret = max(ret, temp);
                temp = i + 1 - vis[s[i]];
                ss = vis[s[i]] + 1;
                vis[s[i]] = i + 1;
            }
            else
                temp++, vis[s[i]] = i + 1;
        }
        ret = max(ret, temp);
        return ret;
    }
};

 

posted @ 2022-02-27 21:31  WTSRUVF  阅读(17)  评论(0编辑  收藏  举报