当前位置 博文首页 > LetJava的博客:Leetcode 76. 最小覆盖子串
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
使用滑动窗口算法思想。
int left = 0, right = 0;
while (right < s.size()) {
window.add(s[right]);
right++;
while (valid) {
window.remove(s[left]);
left++;
}
}
本题步骤如下:
tips:本题优化成 int[128] 代替 哈希表 效率会很高,但不太通用,我认为此优化学习不到啥,所以我没做。
复杂度:O(S + T) 时间,O(S + T) 空间。
class Solution {
public String minWindow(String s, String t) {
char[] ts = t.toCharArray();
Map<Character, Integer> needs = new HashMap<>();
for(char ch : ts) needs.put(ch, needs.getOrDefault(ch, 0) + 1);
Map<Character, Integer> window = new HashMap<>();
int lt = 0; int gt = 0;
int start = 0; int end = s.length() + 1;
int match = 0;
while(gt < s.length()) {
char c1 = s.charAt(gt);
if(needs.containsKey(c1)) {
window.put(c1, window.getOrDefault(c1, 0) + 1);
if(window.get(c1).equals(needs.get(c1))) match ++;
}
gt ++;
while(match == needs.size()) {
if(gt - lt < end - start) {
start = lt;
end = gt;
}
char c2 = s.charAt(lt);
if(needs.containsKey(c2)) {
window.put(c2, window.get(c2) - 1);
if(window.get(c2) < needs.get(c2)) match --;
}
lt ++;
}
}
return end == s.length() + 1 ? "" : s.substring(start, end);
}
}