题目链接
解法
这题我们采用“双指针扫描法”,时间复杂度为. 首先定义两个指针和(),表示现在我们扫描处理的子串是区间。对于这个区间,我们使用一个哈希表来维护内每个字符出现的次数。 扫描时流程如下:
- 指针向后移一位, 同时将哈希表中的计数加一: ;
- 假设移动前的区间中没有重复字符,则移动后,只有可能出现2次。因此我们不断向后移动,直至区间中的个数等于1为止;
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;
}
};