题目描述
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
假设字符串中只包含从’a’到’z’的字符。
样例
输入:"abcabc"
输出:3
问题分析
定义两个指针 i 和 j ,分别指向当前不包含重复字符的子字符串的起始字符和结尾字符。用哈希map保存当前不包含重复字符的子字符串中的字符的个数。j 从0开始遍历字符串,将遍历到的字符在哈希map中加1,然后判断如果该字符在哈希map中的映射大于1,那么用while循环向右移动 i ,把那个重复字符以及之前的所有字符都从哈希map中删除;否则说明该字符不重复,用当前的长度更新ans。最后将 j 向右移动一步。最终当 j 遍历完字符串后,返回ans。
代码实现
class Solution {
public:
int longestSubstringWithoutDuplication(string s) {
unordered_map<char, int> umap;
int ans = 0;
int i = 0, j = 0;
while(j < s.size()){
++umap[s[j]];
if(umap[s[j]] > 1){
while(umap[s[i]] == 1)
--umap[s[i++]];
--umap[s[i++]];
}
else
ans = max(ans, j - i + 1);
j++;
}
return ans;
}
};