Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = "ADOBECODEBANC"
T = "ABC"
Minimum window is "BANC".
Note:
If there is no such window in S that covers all characters in T, return the empty string "".
If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.
一刷:
题解
首先我们给自己的target定义一个hash, 由长度targetnum和词频数组targethash构成。 然后用subwindow. 当前字符为ch
- targethash[ch]--如果出现在词频数组targethash中,词频大于0, 那么新的substring, sourcenum++。直到sourcenum== targetnum
那么从头开始减去。。每次减去,targethash[ch]++。 如果targethash[ch]==0, sourcenum--
public class Solution {
int initTargetHash(int []targethash, String Target) {
int targetnum =0 ;
for (char ch : Target.toCharArray()) {
targetnum++;
targethash[ch]++;
}
return targetnum;
}
public String minWindow(String Source, String Target) {
// queueing the position that matches the char in T
int ans = Integer.MAX_VALUE;
String minStr = "";
int[] targethash = new int[256];
int targetnum = initTargetHash(targethash, Target);
int sourcenum = 0;
int j = 0, i = 0;
for(i = 0; i < Source.length(); i++) {
if(targethash[Source.charAt(i)] > 0)
sourcenum++;
targethash[Source.charAt(i)]--;
while(sourcenum>=targetnum) {
if(ans > i - j + 1) {
ans = Math.min(ans, i - j + 1);
minStr = Source.substring(j, i + 1);
}
targethash[Source.charAt(j)]++;
if(targethash[Source.charAt(j)] > 0)
sourcenum--;
j++;
}
}
return minStr;
}
}