剑指 Offer 48. 最长不含重复字符的子字符串

题目链接:剑指 Offer 48. 最长不含重复字符的子字符串

方法:同向双指针

解题思路

  1. 初始化l = 0, r = 0;
  2. 右指针右移,直到[l, r]之间出现重复字符,然后将左指针右移,直到[l, r]之间没有重复字符;
  3. 即保证[l, r]窗口无重复字符,然后计算最大的窗口长度。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int l = 0, r = 0, n = s.length(), ans = 0;
        int mask[128];
        memset(mask, 0, sizeof(mask));
        while (r < n) {
            if (!mask[s[r] - ' ']) { // 新的字符
                mask[s[r] - ' '] = 1;
                r ++ ;
            } else { // 出现重复字符
                ans = max(ans, r - l); // 计算区间长度
                while (l < r && s[l] != s[r]) { // 缩小区间,直到无重复字符
                    mask[s[l] - ' '] = 0;
                    l ++ ;
                }
                mask[s[l] - ' '] = 0;
                l ++ ;
            }
        }
        ans = max(ans, r - l);
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n)\)
空间复杂度:\(O(1)\)

posted @ 2023-04-09 00:06  lixycc  阅读(21)  评论(0)    收藏  举报