思路
- 这道题 lintcode 上面描述的不完整,应该是找到的子串同时满足开始 index 和 length最小
- 核心思想就是使用两个数组 sCount 和 tCount 来记录已经出现的字符的个数,同时使用一个变量 count 已经符合 target 中字母的个数
- 同时一个经典之处是, 使用 while 循环缩小窗口的左边界
代码
public static String minWindow(String source , String target) {
int[] sCount = new int[128];
int[] tCount = new int[128];
char[] targetCh = target.toCharArray();
char[] sourceCh = source.toCharArray();
for (int i = 0; i < targetCh.length; i++) {
tCount[targetCh[i]]++;
}
int begin = -1;
int end = - 1;
int start = 0;
int count = 0;
for (int i = 0; i < sourceCh.length; i++){
sCount[sourceCh[i]]++;
if (sCount[sourceCh[i]] <= tCount[sourceCh[i]]) {
count++;
}
if (count == target.length()) {
while (start < i && sCount[sourceCh[start]] > tCount[sourceCh[start]]) {
sCount[sourceCh[start]]--;
start++;
}
begin = start;
end = i;
break;
}
}
System.out.println(begin + " " + end);
return begin == -1? "": source.substring(begin,end+1);
}
参考