指尖劃過的軌跡,藏着最細膩的答案~

題目:

給你一個字符串 s ,請找出滿足每個字符最多出現兩次的最長子字符串,並返回該子字符串的 最大 長度。

示例 1:

輸入: s = "bcbbbcba"
輸出: 4
解釋:
以下子字符串長度為 4,並且每個字符最多出現兩次:"bcbbbcba"。

示例 2:

輸入: s = "aaaa"
輸出: 2
解釋:
以下子字符串長度為 2,並且每個字符最多出現兩次:"aaaa"。

提示:

$2 \leq s.length \leq 100$
$s$ 僅由小寫英文字母組成。

分析:

這是一個最長子數組的問題,對於這種最長子數組/最短子數組我們可以使用不定長滑動窗口來解決,初始左端點l為0,右端點r為0,遍歷數組s,移動右端點r,同時使用一個哈希表來記錄每個字符出現的次數,如果右端點字符s[r]在哈希表中已經出現兩次,則需要移動左端點直到與s[r]相同處,即在窗口中刪除一次s[r]字符,同時還需要記錄最大的左端點l與右端點r之間的最大距離即為答案。

AC代碼:

class Solution {
public:
    int maximumLengthSubstring(string s) {
        unordered_map<char, int> cnt;
        int n = s.size();
        int ans = 0;
        int l = 0, r = 0;

        while (r < n) {
            if (cnt[s[r]] == 2) {
                while (s[l] != s[r] && l < r) {
                    cnt[s[l]]--;
                    l++;
                }
                l++;
            } else {
                cnt[s[r]]++;
            }

            ans = max(ans, r - l + 1);
            r++;
        }

        return ans;
    }
};