สมมติว่าเราได้ให้สตริง s ที่ประกอบด้วยตัวพิมพ์ใหญ่เท่านั้น เราสามารถดำเนินการได้มากที่สุด k การดำเนินการกับสตริงนั้น ในการดำเนินการเดียว เราสามารถเลือกอักขระใดๆ ของสตริงและเปลี่ยนเป็นอักษรตัวพิมพ์ใหญ่อื่นๆ ได้ เราต้องหาความยาวของสตริงย่อยที่ยาวที่สุดที่มีตัวอักษรซ้ำกันทั้งหมดที่เราจะได้รับหลังจากดำเนินการข้างต้น ดังนั้นหากอินพุตมีลักษณะดังนี้:“ABAB” และ k =2 ผลลัพธ์จะเป็น 4 เนื่องจาก ‘A’ สองตัวที่มี ‘B’ สองตัวหรือในทางกลับกัน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- maxCount :=0, ans :=0 and n :=ขนาดของสตริง s
- สร้างอาร์เรย์ cnt ขนาด 26 และ j :=0
- สำหรับ i :=0 ถึง n – 1
- เพิ่ม ct[s[i] – 'A'] ขึ้น 1
- maxCount :=max ของ maxCount, นับ[s[i] – 'A']
- ในขณะที่ j <=i และ i – j + 1 – maxCount> k ทำ
- ลด ct[s[j] – ‘A’]
- เพิ่ม j ขึ้น 1
- ans :=สูงสุดของ ans, i – j + 1
- คืนสินค้า
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int characterReplacement(string s, int k) {
int maxCount = 0;
int ans = 0;
int n = s.size();
vector <int> cnt(26);
int j = 0;
for(int i = 0; i < n; i++){
cnt[s[i] - 'A']++;
maxCount = max(maxCount, cnt[s[i] - 'A']);
while(j <= i && i - j + 1 - maxCount > k){
--cnt[s[j] - 'A'];
j++;
}
ans = max(ans, i - j + 1);
}
return ans;
}
};
main(){
Solution ob;
cout << ob.characterReplacement("ABAB", 2);
} อินพุต
"ABAB" 2
ผลลัพธ์
4