Сложность: medium
Дана строка s и целое число k. Верните длину самой длинной подстроки s, которая содержит не более k различных символов.
Пример:
Input: n = 27
Output: true
Explanation: 27 = 3^3
👨💻 Алгоритм:
1⃣Инициализация
Используйте два указателя (left и right) для отслеживания текущего окна в строке. Создайте словарь для отслеживания количества каждого символа в текущем окне. Инициализируйте переменные для хранения максимальной длины подстроки (max_length).
2⃣Раздвижение окна
Перемещайте правый указатель (right) по строке и обновляйте словарь. Если количество различных символов в словаре превышает k, перемещайте левый указатель (left) вправо, уменьшая счетчик символов, пока количество различных символов снова не станет меньше или равно k.
3⃣Обновление максимальной длины
На каждом шаге проверяйте и обновляйте максимальную длину подстроки, если текущее окно содержит не более k различных символов. В конце верните максимальную длину подстроки.
😎 Решение:
public class Solution {
public int LengthOfLongestSubstringKDistinct(string s, int k) {
int left = 0;
int right = 0;
Dictionary<char, int> charCount = new Dictionary<char, int>();
int maxLength = 0;
while (right < s.Length) {
if (!charCount.ContainsKey(s[right])) {
charCount[s[right]] = 0;
}
charCount[s[right]]++;
while (charCount.Count > k) {
charCount[s[left]]--;
if (charCount[s[left]] == 0) {
charCount.Remove(s[left]);
}
left++;
}
maxLength = Math.Max(maxLength, right - left + 1);
right++;
}
return maxLength;
}
}Ставь 👍 и забирай 📚 Базу знаний