leetcode专题训练 3. Longest Substring Without Repeating Characters

这道题暴力会超时,所以要想一些技巧。我的技巧是用一个map类型的变量mp存储所有字符串中曾经出现过的字符上一次出现的位置,同时记下当前无重复的子串的开始位置head。之后的步骤就是扫描整个string,如果当前位中字符没有出现过或者出现位置在head之前,那么就意味着当前位可以加入目前的子串;否则就说明当前位不能加入目前子串,当前无重复的子串开始位置就变为了当前字符上一次出现位置加一,同时字串长度也要减去字符上一次出现位置。当找到所有无重复子串后,就可以知道最长的无重复子串的长度了。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int Maxnum = 0;
        int l = s.size();
        map<char, int> mp;
        mp.clear();
        int num = 0, head = 0;
        for (int i = 0; i < l; i++) {
            if (!mp.count(s[i]) || mp[s[i]] < head) { //如果当前字符的上一次出现在此子串前,也就是不影响当前子串
                num++;
            } else {
                num = i - mp[s[i]];
                head = mp[s[i]] + 1;
            }
            mp[s[i]] = i;
            Maxnum = max(Maxnum, num);
        }
        return Maxnum;
    }
};

你可能感兴趣的:(leetcode专题训练 3. Longest Substring Without Repeating Characters)