指尖劃過的軌跡,藏着最細膩的答案~
題目:
給你一個字符串 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;
}
};