这题滑动窗口不难想,但坑是真的多;
首先是大小写匹配的问题,必须拿52个空间去存储状态;
其次是要考虑到只有一个元素的情况,我这里将通过将区间设置为左开右闭从而包含了这种情况。
// 冲刺036
class Solution {
public String minWindow(String s, String t) {
// get num of t
int[] num = new int[52];
for (int i = 0; i < t.length(); i++) {
num[change(t.charAt(i))]++;
}
int len = s.length();
int[] pre = new int[52];
int l = 0;
int r = len + 1;
int j = 0;
for (int i = 1; i <= len; i++) {
pre[change(s.charAt(i - 1))]++;
if (judge(pre, num)) {
for (; j < i; j++) {
pre[change(s.charAt(j))]--;
if (!judge(pre, num)) {
if (i - j < r - l) {
r = i;
l = j;
}
j++;
break;
}
}
}
}
return r == len + 1 ? "" : s.substring(l, r);
}
int change(char c) {
if (Character.isLowerCase(c)) {
return c - 'a';
} else {
return c - 'A' + 26;
}
}
boolean judge(int[] pre, int[] num) {
for (int i = 0; i < 52; i++) {
if (pre[i] < num[i]) {
return false;
}
}
return true;
}
}