76:最小覆盖子串
题目描述:
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
代码及注释
/**
*类似这种题使用滑动窗口解决:非常重要
*滑动窗口问题:双指针
*/
class Solution {
public String minWindow(String s, String t) {
//记录对应字母出现的次数
int[] cnt = new int[128];
for(char c : t.toCharArray()){
cnt[c]++;//t中字母出现的次数
}
int from = 0;
int total = t.length();
int min = Integer.MAX_VALUE;
for(int i = 0,j = 0; i < s.length();i++){
if(cnt[s.charAt(i)]-- > 0){
total--;
}
while(total==0){
if(i-j+1 < min){
min = i-j+1;
from = j;
}
if(++cnt[s.charAt(j++)] > 0){
total++;
}
}
}
return (min == Integer.MAX_VALUE)?"":s.substring(from,from+min);
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
代码来源:b站
链接:https://www.bilibili.com/video/av68783564?p=74