給定一個字串 s 和一個整數 k,你可以選擇字串中的任意一個字符並將其更改為任何其他的大寫英文字母。最多可以執行這個操作 k 次。請返回在上述操作後,能夠得到的最長的只包含相同字母的子字串長度。
範例 1:
範例 2:
限制條件:
這題要求我們找到能夠通過最多 k 次字符替換後形成的最長只包含相同字符的子字串。由於只允許 k 次字符替換,這意味著我們需要找到某個子串,該子串中最多有 k 個字符與目標字符不同。
為了解決這個問題,我們可以使用「滑動視窗」方法來遍歷字串,並且維持當前視窗中的字母出現次數。在每個時刻,我們可以計算出能夠通過替換獲得的最大相同字符子串。
具體步驟如下:
class Solution {
public:
int characterReplacement(string s, int k) {
unordered_map<char, int> count;
int max_count = 0; // 當前視窗中最多的相同字母的個數
int left = 0; // 左指針
int result = 0; // 最長子串的長度
for (int right = 0; right < s.size(); ++right) {
count[s[right]]++;
max_count = max(max_count, count[s[right]]);
// 若需要替換的字符數量大於 k,則縮小視窗
if (right - left + 1 - max_count > k) {
count[s[left]]--; // 減少左指針字符的計數
left++; // 左指針右移
}
// 記錄當前視窗的最大長度
result = max(result, right - left + 1);
}
return result;
}
};
1. 滑動視窗技術:
2. 視窗內最多相同字符的計算:
3. 條件判斷與視窗調整:
4. 最長子串的計算:
5. 時間複雜度:O(n),其中 n 是字串的長度。我們只需遍歷一次字串,並且每次操作中更新哈希表的時間為常數。
6. 空間複雜度:O(1),因為哈希表的大小在最壞情況下最多是 26 個字母,因此我們的空間複雜度是常數級別。
這道題使用滑動視窗技術來解決,通過維持當前視窗中的字符出現次數,並利用最大相同字符的頻率來判斷是否需要縮小視窗。這種解法可以有效地在 O(n) 時間內找到答案,並且適合處理長度較大的字串。
以上是第二十七天的自學內容分享,謝謝大家。