Leetcode 424 Longest Repeating Character Replacement
Soru
You are given a string s and an integer k. You can choose any character of the string and change it to any other uppercase English character. You can perform this operation at most k times.
Return the length of the longest substring containing the same letter you can get after performing the above operations.
Örnek 1
Input: s = "ABAB", k = 2
Output: 4
Explanation: Replace the two 'A's with two 'B's or vice versa.
Örnek 2
Input: s = "AABABBA", k = 1
Output: 4
Explanation: Replace the one 'A' in the middle with 'B' and form "AABBBBA".
The substring "BBBB" has the longest repeating letters, which is 4.
Çözüm
- Bir string içinde belirli bir sayıda karakter değişikliği yaparak elde edilebilecek en uzun tekrar eden karakter dizisini bulmanızı ister. Bu soruda, maksimum k karakteri değiştirerek bir karakteri diğer bir karakterle değiştirebilirsiniz, ve amacınız, en uzun aynı karakter dizisini (tek tip dizi) oluşturmaktır.
- Girdi: Bir string s ve bir tam sayı k.
- Çıktı: En fazla k karakter değiştirerek elde edilebilecek en uzun tekrar eden karakter dizisinin uzunluğu.
- Bu problem, kaydırmalı pencere (sliding window) veya iki işaretçi tekniği kullanılarak çözülebilir. Buradaki temel fikir, bir pencere içinde en fazla k değişiklik ile oluşturulabilecek en uzun alt diziyi bulmaktır. Pencere boyutu, penceredeki en yaygın karakterin sayısına ve k’ya bağlı olarak dinamik olarak ayarlanır.
- Çalışma Mekanizması:
- Değişkenlerin İnitialize Edilmesi: count karakter sayılarını tutar, max_count penceredeki en sık tekrar eden karakterin sayısını, max_length ise en uzun alt dizinin uzunluğunu tutar.
- Döngü İle İşlem: right işaretçisi string boyunca ilerler ve her karakter için count güncellenir. Ayrıca, her adımda max_count güncellenir.
- Pencere Kontrolü: Eğer pencerenin boyutu eksi içindeki en yaygın karakterin sayısı k’dan büyükse, bu, daha fazla değişiklik gerektiği anlamına gelir. Bu durumda, left işaretçisi artırılarak pencere daraltılır.
- Maksimum Uzunluğun Güncellenmesi: Pencere uygun boyutta olduğunda, max_length güncellenir.
- Sonuç Dönüşü: Tüm işlemler tamamlandığında, hesaplanan maksimum uzunluk döndürülür.
Code
class Solution:
def characterReplacement(self, s, k):
count = {}
max_length = 0
max_count = 0
left = 0
for right in range(len(s)):
count[s[right]] = count.get(s[right], 0) + 1
max_count = max(max_count, count[s[right]])
# Pencere boyutu - içindeki en yaygın karakterin sayısı > k ise pencereyi daralt
while (right - left + 1) - max_count > k:
count[s[left]] -= 1
left += 1
# Mevcut pencere boyutu maksimum uzunluğu güncelle
max_length = max(max_length, right - left + 1)
return max_length
Complexity
- Time complexity (Zaman Karmaşıklığı) : O(n), burada n string s’nin uzunluğudur. Her karakter için sabit zaman işlemi yapılır.
- Space complexity (Alan Karmaşıklığı) : O(1), karakter sayısını tutmak için kullanılan alan genellikle sabittir (ASCII veya Unicode gibi sınırlı bir karakter seti varsayılırsa).