提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
今天开始开一个新的模块,细致地拆分学习别人的题解
一、76. 最小覆盖子串
- yuri题解
- yuri题解
class Solution {
public String minWindow(String s, String t) {
char[] charS = s.toCharArray();
char[] charT=t.toCharArray();
int count= t.length();
int[] cnt =new int[128];
for(int i=0; i<t.length();i++){
cnt[charT[i]-'A']++;
}
int left=0;
int start =-1;
int end=s.length();
for(int right=0; right< s.length(); right++){
cnt[charS[right]-'A']--;
if(cnt[charS[right]-'A']>=0){
count--;
}
while(count==0){
cnt[charS[left]-'A']++;
if(cnt[charS[left]-'A']>0){
if(right-left<end-start){
start=left;
end=right;
}
count++;
}
left++;
}
}
return start==-1? "":s.substring(start,end+1);
}
}
-
- 为什么采用128位的数组记录ASCII码的相对位置, 因为ASCII码总共有128位,包括大写字母 小写字母和特殊符号
-
- cnt意味着 当前窗口 到完成匹配任务还需的各字符数
-
- count递减到0时 反映了当前窗口完成匹配任务 需要开始缩减窗口
-
- 为什么 if(- - cnt[ s[r] - ’ A '] >= 0)要先- - :cnt数组中- - 为加入项 完成匹配任务 ++ 为左侧减少项 为了不完成冗余的匹配
-
- 为什么 start 设置为-1, 因为如果需要完全采纳字符串s,则start将仍然是0,如果通过判断字符串开始start是否是0,我们将返回空字符串“”,但实际上我们应该返回完整的字符串s
总结
滑动窗口通过扩张右端点,捕获字符串s中的字符,来尽量满足与字符串t的匹配任务,任务匹配度数组cnt[ ]数值大于0意味着仍然需要匹配特定字符,数值小于0意味着有盈余的字符,等于0意味着该字符恰好与字符串t中的字符数一致。count记录还需匹配的字符,显然当count = =0时
我们在试图完成匹配任务时,有两种状态,第一种是不进入while(count==0)循环,即尚未获得字符串t中的全部字符;第二种状态是,找全字符后直接开始缩减左侧窗口边界,那么会遇到两种情况,
- 第一种是缩减的恰好是我们需要的字符,而且缩减后我们将无法完成匹配任务,因此我们
①要记录缩减窗口前的边界,并与目前记录的最短边界做比较
②因为我们缩减了有效字符,我们需要匹配的字符数count=count+1; - 第二种就是我们缩减的左边界不影响匹配,我们只需要左边界自增 left++即可