大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说【数组、双指针】day5_76. 最小覆盖子串,希望您对编程的造诣更进一步.
给你一个字符串 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
由英文字母组成
题解
思路:双指针+滑动窗口
1.将t中所有字符的数量记录到字典中,并记录需要包含字符的总数量n(即字符串t的长度)
2.用i,j表示滑动窗口的左边界和右边界,通过改变i,j来扩展和收缩滑动窗口
3.j向右移动,直到包含t中的所有的字符(拿到一个需要的字符,除了维护字典,也需要维护总数量n,n为0时说明全部包含);i向左移动,去除不需要的字符,直到碰到字典中包含的字符且dict(a) = 0,记录此时的子串s1
4.i向右移动一格,此时也需要维护字典和总数量n,再重复步骤3操作,得到子串s2,s1和s2比较长度,取最短的一个(步骤3,4循环进行,直到j移动到字符串s的最后一个字符为止)
时间复杂度:O(m) 空间复杂度:O(n)
class Solution {
public String minWindow(String s, String t) {
int m = s.length();
int n = t.length();
if (n > m) {
return "";
}
// 通过字典记录需要的字符数量
Map<Character, Integer> dict = new HashMap<>();
for (int i = 0; i < n; i++) {
dict.put(t.charAt(i), dict.getOrDefault(t.charAt(i), 0) + 1);
}
// 用i,j表示滑动窗口的左边界和右边界,通过改变i,j来扩展和收缩滑动窗口
int i = 0, j = 0;
// 所需字符的数量
int needNum = n;
// 记录最短子串 result
String result = null;
while (i < m && j < m) {
char rightC = s.charAt(j++);
if (null != dict.get(rightC)) {
if (dict.get(rightC) > 0) {
needNum--;
}
dict.put(rightC, dict.get(rightC) - 1);
}
if (needNum == 0) {
// i收缩,直到碰到必须要包含的元素
while (true) {
char leftC = s.charAt(i);
Integer count = dict.get(leftC);
if (null != count && count < 0) {
dict.put(leftC, count+1);
}
// 碰到必须包含的字符了
if (null != count && count == 0) {
break;
}
i++;
}
if (result == null) {
result = s.substring(i, j);
} else {
result = result.length() > s.substring(i, j).length() ? s.substring(i, j) : result;
}
// i+1,继续寻找下一个滑动窗口
dict.put(s.charAt(i), dict.get(s.charAt(i)) + 1);
needNum++;
i++;
}
}
return result == null ? "" : result;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36788.html