给定一个字符串 S 和一个字符串 T,找到 S 中包含 T 中所有字符的最小窗口,复杂度为 O(n)。
例子:
输入:S =“ADOBECODEBANC”,T =“ABC”输出:“BANC”
我努力尝试使用滑动窗口技术提出解决方案,但我被困在这里。有人可以帮忙吗?
package com.tryPrep.Strings;
import java.util.HashMap;
public class MinWindowSubstring {
static String minWinSubStr(String s, String t){
HashMap<Character, Integer> tabl = new HashMap<>();
for(char c: t.toCharArray()){
int charCount=0;
if(tabl.containsKey(c))
charCount = tabl.get(c);
tabl.put(c, charCount+1);
}
int begin =0, end =0, counter=tabl.size();
String ans="";
int max=s.length();
while(end < s.length()) {
char endChar = s.charAt(end);
if (tabl.containsKey(endChar)) {
int charCount = tabl.get(endChar);
if (charCount > 0) {
counter--;
tabl.put(endChar, charCount - 1);
}
}
end++;
while (counter == 0) {
if (max > end - begin) {
ans = s.substring(begin, end - begin);
max = ans.length();
}
char beginChar = s.charAt(begin);
if (tabl.containsKey(beginChar)) {
int charCount = tabl.get(beginChar);
if(charCount == 0) {
tabl.put(beginChar, charCount + 1);
counter++;
}
}
begin++;
}
}
return ans;
}
public static void main(String[] args) {
String s = "ADOBECODEBANC";
String t = "ABC";
System.out.println("minWinSubStr M1 : " + minWinSubStr(s, t));
}
}
输出 :
minWinSubStr M1 : ADOBEC
我看到当 end 达到字符串长度时循环得到满足,但计数器仍然不为 0。您能指出是什么问题来解锁我吗?
catspeake
相关分类