题目
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
代码
char * minWindow(char * s, char * t){
int arr[128] = {0}, ass[128] = {0};
//因为s里面可能包含几个t,所以用mini,minj来记录最短的位置
int count = 0, i = 0, mini = 0, minj = 100000000, j, k;
while (t[i] != '\0') {
arr[t[i]]++;
count++;
i++;
}
i = 0, j = 0;
//表示已i为窗口起始位置时,包含t的最小窗口,ass[]记录窗口里所有元素的个数
while (s[i] != '\0') {
while (s[j] != '\0') {
ass[s[j]]++;
if (arr[s[j]] > 0) {
if (ass[s[j]] <= arr[s[j]]) count--;
if (count == 0) break;
}
j++;
}
if (s[j] == '\0') break;
//缩减窗口
while (i <= j && arr[s[i]] < ass[s[i]]) {
ass[s[i]]--;
i++;
}
if (j - i < minj - mini) {
mini = i;
minj = j;
}
ass[s[i]]--;
count = 1;
i++;
j++;
}
if (minj >= j) return "";
k = 0;
char *str = (char *)malloc(sizeof(char) * (minj - mini + 2));
while (mini <= minj) str[k++] = s[mini++];
str[k] = '\0';
return str;
}