题目描述:
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
思路:
双指针算法,动态维护哈希表进行优化。从直觉上可以看出指针i右移的过程中,指针j(j为距离i最远的保证j到i的子串满足条件的指针)也同样有向右的趋势(即不动或向右),也可通过反证易得。因而,指针i和j都最多移动n次,故时间复杂度为O(2n) = O(n).
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> heap;
int res = 0;
for(int i = 0, j = 0; i < s.size(); i ++ ){
heap[s[i]] ++;
while(heap[s[i]] > 1) heap[s[j ++]] --;
res = max(res, i - j + 1);
}
return res;
}
};