解题思路:
滑动窗口:
创建两个数组,用于记录目标字符串的词袋(target)和当前窗口中包含的有效字符串的词袋(current)。这里的“有效”指的是字母是word2中出现过的单词。
然后滑动窗口进行比对,当两个词袋一致时,就存在一个可能的substring window。
这里参考了题目后面description中的一个解答:
https://leetcode.com/problems/minimum-window-substring/discuss/194112/Java-O(n)-time-O(1)-space
所以此篇博客设置为转载标签。
提交代码:
class Solution{
public String minWindow(String s,String t) {
int[] current=new int[126];
int[] target=new int[126];
Queue<Integer> q=new LinkedList<>();
int i,j,k;boolean flag;String res="";
int minWindow=Integer.MAX_VALUE;
for(i=0;i<t.length();i++)
target[t.charAt(i)]++;
for(j=0;j<s.length();j++) {
if(target[s.charAt(j)]>0) {
q.add(j);
current[s.charAt(j)]++;
while(current[s.charAt(q.peek())]>target[s.charAt(q.peek())]) {
current[s.charAt(q.peek())]--;
q.remove();
}
i=q.peek();
flag=true;
for(k=0;k<target.length;k++)
if(target[k]>current[k]) {
flag=false;
break;
}
if(flag&&j-i+1<minWindow) {
minWindow=j-i+1;
res=s.substring(i, j+1);
}
}
}
return res;
}
}
运行结果: