[Medium]LeetCode第3题——无重复字符的最长子串

76 阅读1分钟

题目链接

无重复字符的最长子串

解法

这题我们采用“双指针扫描法”,时间复杂度为O(n)O(n). 首先定义两个指针iijjiji\le j),表示现在我们扫描处理的子串是[i,j][i,j]区间。对于这个区间,我们使用一个哈希表来维护[i,j][i,j]内每个字符出现的次数。 扫描时流程如下:

  1. 指针jj向后移一位, 同时将哈希表中s[j]s[j]的计数加一: hash[s[j]]++hash[s[j]]++;
  2. 假设jj移动前的区间[i,j][i,j]中没有重复字符,则jj移动后,只有s[j]s[j]可能出现2次。因此我们不断向后移动ii,直至区间[i,j][i,j]s[j]s[j]的个数等于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;
    }
};