leetcode76. 最小覆盖子串
leetcode76. 最小覆盖子串
题目描述
链接: leetcode76.
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例2:
输入:s = "a", t = "a" 输出:"a"
示例3:
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
题解
滑动窗口: 在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口
- java解法
public String minWindow(String s, String t) {Map<Character, Integer> targetStrMap = new HashMap<>(); // 目标字符串t的字符和个数mapMap<Character, Integer> window = new HashMap<>(); // 当前窗口的字符和个数mapint tLen = t.length(); // 模板字符串长度for (int i = 0; i < tLen; i++) { char c = t.charAt(i);targetStrMap.put(c, targetStrMap.getOrDefault(c, 0) + 1);}int l = 0; // 左指针int r = -1; // 右指针int len = Integer.MAX_VALUE; // 当前字符串长度int ansL = -1; // 当前字符串左边索引int ansR = -1; // 当前字符串右边索引int sLen = s.length();while (r < sLen) { // 右指针走到最末尾时停止++r;if (r < sLen && targetStrMap.containsKey(s.charAt(r))) { // 如果r位置包含目标字符串的字符window.put(s.charAt(r), window.getOrDefault(s.charAt(r), 0) + 1);}while (isValidWindow(targetStrMap, window) && l <= r) { // 判断Window里面的字符是否符合要求了if (r - l + 1 < len) {len = r - l + 1;ansL = l;ansR = l + len;}if (targetStrMap.containsKey(s.charAt(l))) { // 如果l位置包含目标字符串的字符window.put(s.charAt(l), window.getOrDefault(s.charAt(l), 0) - 1);}++l;}}return ansL == -1 ? "" : s.substring(ansL, ansR);}public boolean isValidWindow(Map<Character, Integer> ori, Map<Character, Integer> cnt) {for (Map.Entry<Character, Integer> entry : ori.entrySet()) {Character key = entry.getKey();Integer val = entry.getValue();if (cnt.getOrDefault(key, 0) < val) {return false;}}return true;}
- golang解法
func minWindow(s string, t string) string {targetStrMap, window := map[byte]int{}, map[byte]int{}left, right, ansL, ansR, curLen := 0, -1, -1, -1, int(^uint(0) >> 1)for i := 0; i < len(t); i++ {targetStrMap[t[i]]++}for right < len(s) {right++if right < len(s) && targetStrMap[s[right]] > 0 {window[s[right]]++}for isValidWindow(targetStrMap, window) {if right - left + 1 < curLen {curLen = right - left + 1ansL = leftansR = left + curLen}if targetStrMap[s[left]] > 0 {window[s[left]]--}left++}}if ansL == -1 {return ""}return s[ansL:ansR]
}func isValidWindow(targetStrMap map[byte]int, window map[byte]int) bool {for key, value := range targetStrMap {if window[key] < value {return false}}return true
}
leetcode76. 最小覆盖子串相关推荐
- LeetCode-76: 最小覆盖子串
题目描述: 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意:如果 s ...
- leetcode76 最小覆盖子串
给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC& ...
- Leetcode--76. 最小覆盖子串
给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = "ABC& ...
- LeetCode76——最小覆盖子串
题目: 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBANC", T = " ...
- Leetcode-76:最小覆盖子串(困难题) 滑动窗口法超详细解析
题目链接 https://leetcode-cn.com/problems/minimum-window-substring/ 题目 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有 ...
- cstring判断是否包含子串_leetcode76. 最小覆盖子串
leetcode76. 最小覆盖子串 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串. 示例: 输入: S = "ADOBECODEBANC&qu ...
- Leetcode 76最小覆盖子串77组合78子集
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...
- [Leedcode][JAVA][第76题][最小覆盖子串]滑动窗口]
[问题描述][第76题][最小覆盖子串][中等] 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串.示例:输入: S = "ADOBECODEBAN ...
- 【LeetCode】【HOT】76. 最小覆盖子串(滑动窗口)
[LeetCode][HOT]76. 最小覆盖子串 文章目录 [LeetCode][HOT]76. 最小覆盖子串 package hot;public class Solution76 {public ...
最新文章
- 小程序统一服务消息_[miniblog]小程序订阅消息踩坑记
- TCP服务端收到syn但是不回复syn ack问题分析
- 数据结构与算法:二分法
- 为人处事的一些小句子。
- 公式冒号是什么意思_三角学中,这么一堆公式其实就说了2个事而已
- Arturia Prophet Mac音频插件:将Prophet 5,Prophet VS,Prophet Hybrid三种不同音乐合成器于一体
- mathmagic pro mac使用教程|快速地创建任何方程
- JS面向对象的实现和原理
- consul 数据持久化_一起学习Nacos的数据持久化
- python selenium 等待元素_python3 selenium 设置元素等待的三种方法
- word参考文献交叉引用
- 新品发布 | 麒麟产业服务:麒麟云上产业园,打造数字新基建
- 如何编写Word文档 多级编号
- 团队的Kick off
- 记《浪潮之巅》《硅谷之谜》《智能时代》
- 无法启动此程序,因为计算机中丢失MSVCRTD.dll(MFC42D.dll, MFCO42D.dll)
- Dorabot蓝胖子招聘 薪资Open谈|3D视觉、机器人软件、SLAM算法工程师等岗位
- JavaScript 之 核心语法 [ 对象 ]
- SSM整合ActiveMQ
- 考研复试--数据链路层--计算机网络面试题
热门文章
- Keith Hill的Effective Windows PowerShell.pdf下载
- 如何用VS2005制作Web安装程序
- CAD编辑工具中如何设置图纸的比例
- VMware ESX 5.0 网卡负载均衡配置3种方法
- 线程轮循打印ABC...
- 【译】区块链是如何工作的——用JavaScript演示
- phalcon: Profiling分析 profilter / Plugin结合,dispatcher调度控制器 监听sql执行日志
- New StoryBoard in iOS9
- linux下线程控制
- contentProvider 内容提供者