题目
思路(滑动窗口)
- 这道题需要将每个字符的开销用字符串等长的数组存储起来,并按滑动窗口的思想,得到可转化的最大长度
- 滑动窗口核心思想:用两个指针start和end表示数组diff的子数组的开始下标和结束下标
- 约束条件是:要满足子数组的元素和不超过maxCost。
- 可以知道的是子数组的长度是:end-start+1.
- 移动指针的原则:
-
- 固定其中一个指针(如start指针),并逐步缩小移动指针的下标(即向左移动),直达刚满足条件,再移动一位固定指针,重复操作
-
- 或者固定其中一个指针(如end指针),并逐步缩小移动指针的下标(即向右移动),也是直到满足条件后,再移动一位固定指针并重复操作。
Code
class Solution {
public int equalSubstring(String s, String t, int maxCost) {
int[] nums = new int[s.length()];
//创建一个与字符串长度对应大小的数组
for (int i = 0; i < s.length(); i++) {
// 每笔开销都转换为数组元素,方便计算
nums[i] = Math.abs(s.charAt(i) - t.charAt(i));
}
Queue<Integer> queue = new LinkedList<>();
//Queue队列,链表属于队列的一种
int currCount = 0;
int ret = 0;
for (int i = 0; i < nums.length; i++) {
while (!queue.isEmpty() && nums[i] + currCount > maxCost) {
// 使用队列存储窗口 左边缩进
currCount -= queue.poll();
}
if (nums[i] + currCount <= maxCost) {
// 右边前进
currCount += nums[i];
queue.add(nums[i]);
ret = Math.max(ret, queue.size());
}
}
return ret;
}
}
代码运行截图