问题描述:
给你一个字符串 s
、一个字符串 t
。返回 s
中涵盖 t
所有字符的最小子串。如果 s
中不存在涵盖 t
所有字符的子串,则返回空字符串 ""
。
注意:
- 对于
t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。 - 如果
s
中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC" 输出:"BANC" 解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。
示例 2:
输入:s = "a", t = "a" 输出:"a" 解释:整个字符串 s 是最小覆盖子串。
示例 3:
输入: s = "a", t = "aa" 输出: "" 解释: t 中两个字符 'a' 均应包含在 s 的子串中, 因此没有符合条件的子字符串,返回空字符串。
提示:
m == s.length
n == t.length
1 <= m, n <= 105
s
和t
由英文字母组成
上代码,拿去即可运行:
package com.onlyqi.daydayupgo01.suanfa;
import java.util.*;
import java.util.stream.Collectors;
public class Test12 {
public static void main(String[] args) {
String source="ADOBECODEBANC";
String target="ABC";
System.out.println(maxSlidingWindow(source,target ));
}
public static String maxSlidingWindow(String source, String target) {
String[] strings = source.split("");
String restultStr = "";
List<String> stringList = Arrays.asList(target.split(""));
Map<String, Long> resultMap = stringList.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));
for (int i = 0; i < strings.length; i++) {
Map<String, Long> map = new HashMap<>();
for (int j = i; j < strings.length; j++) {
if (resultMap.keySet().contains(strings[j])) {
Long count = Objects.isNull(map.get(strings[j])) ? 1L : map.get(strings[j]) + 1;
map.put(strings[j], count);
}
if (map.equals(resultMap)) {
if((j+1-i)<restultStr.length()||i==0){
restultStr=source.substring(i, j+1);
}
break;
}
}
}
return restultStr;
}
}
代码运行结果:
慢慢来才是最快的方法--天涯明月 共勉
我要刷300道算法题,第131道 。 希望自己可以坚持下去 。