知识点
滑动窗口
解题思路
我们需要统计目标字母表t中每个字母出现的频率。然后,我们使用两个指针left和right来维护一个滑动窗口。
具体步骤如下:
- 初始化指针left和right为字符串s的起始位置。
- 移动指针right,扩展窗口,直到窗口中包含了所有目标字母表t中的字母。
- 记录当前窗口的长度和起始位置。
- 移动指针left,缩小窗口,直到窗口无法再排除目标字母表t中的字母。
- 重复步骤2-4,直到指针right到达字符串s的末尾。
Java题解
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param t string字符串
* @return string字符串
*/
public String minWindow (String s, String t) {
// write code here
int[] targetFreq = new
int[128]; // 用于统计目标字母表t中每个字母的频率
for (char c : t.toCharArray()) {
targetFreq[c]++;
}
int[] windowFreq = new int[128]; // 用于统计窗口中每个字母的频率
int left = 0; // 窗口的左指针
int right = 0; // 窗口的右指针
int minLength = Integer.MAX_VALUE; // 最小窗口的长度
int start = 0; // 最小窗口的起始位置
int count = t.length(); // 窗口中包含的目标字母的总数
while (right < s.length()) {
char c = s.charAt(right);
windowFreq[c]++;
if (windowFreq[c] <= targetFreq[c]) {
count--;
}
while (count == 0) {
// 更新最小窗口的起始位置和长度
if (right - left + 1 < minLength) {
minLength = right - left + 1;
start = left;
}
char leftChar = s.charAt(left);
windowFreq[leftChar]--;
if (windowFreq[leftChar] < targetFreq[leftChar]) {
count++;
}
left++; // 缩小窗口
}
right++; // 扩展窗口
}
if (minLength == Integer.MAX_VALUE) {
return "";
}
return s.substring(start, start + minLength);
}
}



京公网安备 11010502036488号