Description:
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"
.
Solution:
主要思路就是two pointer,在遍历的同时记录当前有多少个符合期望的character,然后当满足期望的character时,再比较长度。
中间在记录character的时候,可以用一个HashSet配合int数组来实现。
targetNum[]表示最终期待每个char达到的个数
set表示哪些char是我们需要的,也可以用一个循环在targetNum中判断(>0即为所需),但是会慢很多。
count[]表示当前每个所需要的char个数,需要我们在遍历的时候进行维护
current表示当前一共有几个所需的char被记录到,同样需要在遍历的时候维护
注意:current只有当count[i]<targetNum[i]的时候才进行变化(也就是如果我需要3个a,但是当前这段int[]有多余3个a,我们还是认为只有3个啊)。另,边界条件需要取等号,注意一下。
<span style="font-size:18px;">import java.util.*;
public class Solution {
public String minWindow(String s, String t) {
String ans = "";
HashSet<Character> set = new HashSet<Character>();
int targetNum[] = new int[200];
for (int i = 0; i < t.length(); i++) {
set.add(t.charAt(i));
targetNum[t.charAt(i)]++;
}
int target_num = t.length();
int min_len = s.length() + 1;
int count[] = new int[200];
int current_num = 0;
int start = 0;
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (!set.contains(ch))
continue;
if (count[s.charAt(i)] < targetNum[s.charAt(i)])
current_num++;
count[ch]++;
while (start < s.length()
&& (!set.contains(s.charAt(start)) || count[s.charAt(start)] > targetNum[s
.charAt(start)])) {
if (set.contains(s.charAt(start))) {
if (count[s.charAt(start)] <= targetNum[s.charAt(start)])
current_num--;
count[s.charAt(start)]--;
}
start++;
}
if (current_num == target_num && i - start + 1 < min_len) {
min_len = i - start + 1;
ans = s.substring(start, i + 1);
}
}
return ans;
}
}</span>