1、题目描述
给你一个字符串 s
、一个字符串 t
。返回 s
中涵盖 t
所有字符的最小子串。如果 s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
。
注意:
- 对于
t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。 - 如果
s
中存在这样的子串,我们保证它是唯一的答案。
2、算法思路
使用滑动窗口+哈希表(数组代替)
可以学习这题用于计算总类的思路,剩下就是滑动窗口。
3、算法代码
class Solution {
public String minWindow(String S, String T) {
char[] s = S.toCharArray();
char[] t = T.toCharArray();
int[] hash1 = new int[128]; //hash1是记录t中的字符,128根据ASCII表
int[] hash2 = new int[128]; //hash2是记录s中的字符
int kind = 0;
for (char ch : t) {
if (hash1[ch]++ == 0) {
kind++;//统计字符的种类
}
}
int min_length = Integer.MAX_VALUE, begin = -1;
for (int left = 0, right = 0, count = 0; right < s.length; right++) {
char into = s[right];
if (++hash2[into] == hash1[into]) count++;//进窗口,达到和t中的一样字符的个数,count才可以++
while (count == kind) {
if (right - left + 1 < min_length) {//更新结果
min_length = right - left + 1;
begin = left;
}
char out = s[left++];
if (hash2[out]-- == hash1[out]) count--;//出窗口
}
}
if(begin==-1)return new String();
else return S.substring(begin,begin+min_length);
}
}