题目链接:76. 最小覆盖子串 - 力扣(LeetCode)
题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
示例 3:
输入:intervals = [[4,7],[1,4]]
输出:[[1,7]]
解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。
提示:
1 <= intervals.length <= 104intervals[i].length == 20 <= starti <= endi <= 104
我的思路:
先初始化一个字符计数的数组,记录t的不同字母个数的负数,初始化一个ansZ来记录种类数,接着定义一个l做窗口的左指针,sumW记录目前窗口满足t的种类,ansR和ansL分别记录最短字串的两边界,遍历s,如果字符计数数组当前字母的数量++后等于0代表找到了满足t某字母条件的数量,sumW种类++。如果sumW这个临时种类计数和ansZ一样,那么目前的窗口是满足t的字串,进行一个while循环尝试缩短窗口尽可能得到最短字串,先更新字串,目前的l-i小于ansR-ansL就更新ansR和ansL暂时为最短字串,如果当前l指向s的字母在字符计数数组中个数是0,也就是不能再缩短了,因为目前这里是符合位置的,所以从这里退出,sumW--,再继续判断下一次i的结果,如果没有退出while循环那么l--继续缩短窗口。
我的代码:
java
class Solution {
public String minWindow(String s, String t) {
int sL = s.length();
int tL = t.length();
if(sL<tL){
return "";
}
int[] ints = new int[128];
int ansZ = 0;
for (int i = 0; i < tL; i++) {
if(ints[t.charAt(i)]==0){
ansZ++;
}
ints[t.charAt(i)]--;
}
int sumW = 0;
int l = 0;
int ansR = sL;
int ansL = -1;
for (int i = 0; i < sL; i++) {
char c = s.charAt(i);
ints[c]++;
if(ints[c]==0){
sumW++;
}
while (sumW == ansZ){
if(i-l<ansR-ansL){
ansL = l;
ansR = i;
}
if(ints[s.charAt(l)]==0){
sumW--;
}
ints[s.charAt(l)]--;
l++;
}
}
return ansL<0?"":s.substring(ansL,ansR+1);
}
}