题目要求
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从 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再补