剑指offer 49题. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

假设字符串中只包含从’a’到’z’的字符。

样例

输入:"abcabc"

输出:3

 

这题目一开始看了好几遍代码都没懂,关键在于加粗的部分

双指针算法:

思路是  维护一个 i ~ j 的区间,使用hash_map 来确保 i~j之间的数都是不重复的。

每当j往后移动一个位置后。检查有没有重复的,如果没有重复更新j-i+1 为最大答案。如果有重复,从i开始一路删 删到 和j一样值(count>1)的位置。          那么再删除当前(因为s[j]和这个一样),移动到下一个位置重新开始移动J

 

class Solution {
public:
    int longestSubstringWithoutDuplication(string s) {
        unordered_map count;
        int res =0;
        for(int i = 0, j = 0; j < s.size(); j++){
            if( ++count[s[j]] > 1){
                while(count[s[i]] == 1) count[s[i++]]--; //一路删到 !=1
                
                count[s[i++]] --;// 把当前的点删掉然后从下一个位置继续
            }
            res = max(res,j - i + 1);
        }
        return res;
    }
};

 

你可能感兴趣的:(剑指offer)