题解 | #最小覆盖子串#
最小覆盖子串
https://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac
不会窗口滑动,我直接暴力拆解的,双指针+hashMap记事本
import java.util.*;
public class Solution {
/**
* 双指针 + 哈希
* @param S string字符串
* @param T string字符串
* @return string字符串
*/
public String minWindow (String S, String T) {
String minStr = "";
// 创建记事本并初始化
HashMap<Character, Integer> book = new HashMap<>();
initialBook(book, T);
// 循环双指针遍历字符串S
boolean flag = false;
for(int i = 0, j = 0, k = 0; i <= S.length(); i++) {
// 匹配到了一次
if (j >= T.length()) {
String matchStr = S.substring(k, i);
if (minStr.isEmpty())
minStr = matchStr;
else
minStr = matchStr.length() < minStr.length() ? matchStr : minStr;
// 初始化i,j索引
j = 0;
i = k + 1;
flag = false;
// 初始化记事本
initialBook(book, T);
}
if (i < S.length()) {
char c = S.charAt(i);
if (T.contains(String.valueOf(c)) && book.get(c) != 0) {
// 记录匹配字符串的开头索引
if (!flag) {
k = i;
flag = true;
}
book.put(c, book.get(c) - 1);
j++;
}
}
}
return minStr;
}
/**
* 初始化记事本
* @param book
* @param T
*/
public void initialBook(Map<Character, Integer> book, String T) {
for (int i = 0; i < T.length(); i++) {
book.put(T.charAt(i), book.getOrDefault(T.charAt(i), 0) + 1);
}
}
}

