题目描述:https://leetcode-cn.com/problems/minimum-window-substring/
public class Solution1 {
public String minWindow(String s, String t) {
if (s.equals(t)) {
return s;
}
// s 字符串 t 目标串
Map<String, Integer> sCount = new HashMap<>();
Map<String, Integer> tCount = new HashMap<>();
Set<String> unSolvedSet = new HashSet<>();
// 初始化unSolvedSet tCount
for (int i = 0; i < t.length(); i++) {
String si = String.valueOf(t.charAt(i));
unSolvedSet.add(si);
tCount.merge(si, 1, Integer::sum);
}
// 开始滑动窗口
// l收缩 r扩张
int l = 0, r = 0;
int minLen = s.length();
int minL = 0, minR = s.length() - 1;
boolean changed = false;
for (; r < s.length(); r++) {
String si = String.valueOf(s.charAt(r));
if (tCount.get(si) == null) {
continue;
}
sCount.merge(si, 1, Integer::sum);
if (sCount.get(si) >= tCount.get(si)) {
unSolvedSet.remove(si);
}
if (unSolvedSet.isEmpty()) {
// 开始收缩优化了~
for (; r - l + 1 >= t.length(); l++) {
String ssi = String.valueOf(s.charAt(l));
if (tCount.get(ssi) != null) {
// 才有必要去判断
if (sCount.get(ssi) > tCount.get(ssi)) {
sCount.put(ssi, sCount.get(ssi) - 1);
} else if (Objects.equals(sCount.get(ssi), tCount.get(ssi))) {
if (minLen >= r - l + 1) {
changed = true;
minLen = r - l + 1;
minL = l;
minR = r;
}
// 设置一下unSolvedSet
unSolvedSet.add(ssi);
break;
}
}
}
}
}
if (!changed) {
return "";
}
return s.substring(minL, minR + 1);
}
public static void main(String[] args) {
System.out.println(new Solution1().minWindow("ADOBECODEBANC",
"ABC"));
}
}