本文共 1856 字,大约阅读时间需要 6 分钟。
我们需要找到字符串中最长的子串,使得子串中至少有k个大写字母。这个问题可以通过滑动窗口(Sliding Window)技术来解决。滑动窗口方法适用于这类子串问题,因为它能够高效地找到满足条件的最大长度。
初始化指针和数组:使用两个指针left和right来控制窗口的左右边界,同时使用一个数组nums来记录每个字母的出现次数。
遍历字符串:将right指针从左向右移动,逐个字符处理,更新其在字母计数数组中的值。同时,维护一个当前窗口中大写字母数量的最大值max。
调整窗口:当窗口中大写字母的数量小于k时,使用left指针向右移动,减少窗口大小,同时调整字母计数数组,逐步保证窗口内满足条件。
记录最大窗口长度:每次满足条件时,计算当前窗口长度,更新最大长度。
class Solution { public int characterReplacement(String s, int k) { int len = s.length(); int[] nums = new int[26]; int left = 0; int max = 0; int result = 0; for (int right = 0; right < len; right++) { char c = s.charAt(right); if (Character.isUpperCase(c)) { int index = c - 'A'; nums[index]++; } // Update max with current window's max uppercase count if (max < k) { // Need to move left pointer to reduce window size if (left <= right) { char leftC = s.charAt(left); if (Character.isUpperCase(leftC)) { int leftIndex = leftC - 'A'; nums[leftIndex]--; } left++; } } // Update the maximum length if current window satisfies the condition if (max >= k) { int currentLength = right - left + 1; if (currentLength > result) { result = currentLength; } } } return result; }}
初始化变量:创建字母计数数组nums,初始化left指针为0,max记录当前窗口中最大大写字母数量,result存储最终的最大窗口长度。
遍历字符串:通过外部循环从左到右遍历字符串,每一步处理right指针所指的字符。
更新字母计数:如果当前字符是大写字母,更新对应位置的计数。
调整窗口:检查当前窗口的最大大写字母数量是否满足k,如果不满足,移动left指针并更新字母计数,逐步调整窗口以确保满足条件。
记录最大窗口长度:当窗口满足条件时,计算当前窗口长度并与result比较,更新最大值。
这种方法通过尽可能扩大窗口直到满足条件,然后调整窗口的策略,有效地找到最长的子串,确保了结果的正确性,同时保持了算法的高效性。
转载地址:http://tkjzk.baihongyu.com/