题目要求

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从 a 到 z 的字符。
输入:"abcabc"
输出:3

方法1:

双指针,比较好理解,是用哈希表存储两指针范围内字母出现的次数
1、right指针移动,没有重复时,更新最大值,right右移
2、若发现重复过,则移动左指针,一边移动一边将对应字母的哈希表计数-1,直到mymap[s[right]]为1,也就是left移动到了重复字母的右边,计算此时长度right-left+1,更新最大值
3、重复过程,直到right越界

class Solution {
public:
    int longestSubstringWithoutDuplication(string s) {
        unordered_map<char,int> mymap;//左右指针范围内字母出现的次数
        int ans=0,left=0,right=0;
        for(;right<s.size();right++){
            mymap[s[right]]++;
            while(mymap[s[right]]>1){//当right重复时,left指针移动到重复字母的右边
                mymap[s[left]]--;//一边移动一遍减去次数
                left++; //左指针移动
            }
            ans=max(ans,right-left+1);//检查当前不重复字符串是否是最大的,更新最大值
        }
        return ans;
    }
};

方法2:

动态规划,等学到dp再补