LeetCode第76题:最小覆盖子串(困难)
- 题目:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
- 解题思路:我认为题干说的有点不明确,刚开始我以为只要包含就可以,几个不重要。但试过之后发现不行。增加了一个数组,来表示匹配过的字符。但还是没过,最后那个测试那么长的串我也是醉了。。。
class Solution {
public String minWindow(String s, String t) {
int len1 = s.length();
int len2 = t.length();
if (len1 == 0 || len2 == 0) return "";
for(int i=len2;i<=len1;i++){
for(int j=0;j<=len1-i;j++){
String ss = s.substring(j,j+i);
int[] c = new int[i];
for(int k=0;k<i;k++) c[k]=0;
int n;
for(n=0;n<len2;n++){
int m;
for(m=0;m<i;m++){
if(ss.charAt(m)==t.charAt(n) && c[m]==0){
c[m]=1;
break;
}
}
if(m==i) break;
}
if(n==len2) return ss;
}
}
return "";
}
}
- 题解做法:官方解法采用了双指针滑动窗口的方法,具体思路如下。
class Solution {
public String minWindow(String s, String t) {
if (s.length() == 0 || t.length() == 0) {
return "";
}
Map<Character, Integer> dictT = new HashMap<Character, Integer>();
for (int i = 0; i < t.length(); i++) {
int count = dictT.getOrDefault(t.charAt(i), 0);
dictT.put(t.charAt(i), count + 1);
}
int required = dictT.size();
int l = 0, r = 0;
int formed = 0;
Map<Character, Integer> windowCounts = new HashMap<Character, Integer>();
int[] ans = {-1, 0, 0};
while (r < s.length()) {
char c = s.charAt(r);
int count = windowCounts.getOrDefault(c, 0);
windowCounts.put(c, count + 1);
if (dictT.containsKey(c) && windowCounts.get(c).intValue() == dictT.get(c).intValue()) {
formed++;
}
while (l <= r && formed == required) {
c = s.charAt(l);
if (ans[0] == -1 || r - l + 1 < ans[0]) {
ans[0] = r - l + 1;
ans[1] = l;
ans[2] = r;
}
windowCounts.put(c, windowCounts.get(c) - 1);
if (dictT.containsKey(c) && windowCounts.get(c).intValue() < dictT.get(c).intValue()) {
formed--;
}
l++;
}
r++;
}
return ans[0] == -1 ? "" : s.substring(ans[1], ans[2] + 1);
}
}
作者:LeetCode
链接:https://leetcode-cn.com/problems/minimum-window-substring/solution/zui-xiao-fu-gai-zi-chuan-by-leetcode-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。