核心思路:滑动窗口
内容:
主要分为三个步骤:
1.窗口右端不断增大,直至到达字符串s末尾;
2.不断增大窗口左端,因为要求是包含字符串t的最小字符串,所以要将不必要的元素排除在外,直至一个包含其最小的字符串为止;
3.让左端窗口增加一个位置,这样条件不满足,回到步骤1去执行,直至右端窗口到达字符串s的右边界。
如何判断包含了t所有的字符?
答:创建一个need字段,初始为t的长度,全部包含时为0。
class Solution {
public String minWindow(String s, String t) {
int[] sign = new int[128];
for(int i = 0; i < t.length(); i++){
sign[t.charAt(i)]++;
}
int left = 0,right = 0;
int len = s.length();
int need = t.length();
int count = 100000;
String s1 = new String();
String s2 = new String();
while(right < len){
//只有字符串t中的字符是>0的
if(sign[s.charAt(right)] > 0){
need--;
}
sign[s.charAt(right)]--;
if(need == 0){
//只有非t的字符才是<0的,t的字符是正好等于0的
while(sign[s.charAt(left)] < 0){
sign[s.charAt(left)]++;
left++;
}
s1 = s.substring(left,right + 1);
if(s1.length() < count){
count = s1.length();
s2 = s1;
}
sign[s.charAt(left)]++;
left++;
need++;
}
right++;
}
return s2;
}
}
小技巧:利用int数组统计字符char数量(为什么是128?A-Z的整型值是65-90,a-z的整型值是97-122)。