最小覆盖子串

题目描述:

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
提示:
1 <= s.length, t.length <= 10^5
s 和 t 由英文字母组成

题目链接

class Solution {private String s;private String t;private Map<Character,Integer> index;private Map<Character,Integer> window;public String minWindow(String s, String t) {// 初始化int len = s.length();if(t.length()>len) return ""; // 特判if(len == 1){if(t.length() == 1 && s.charAt(0) == t.charAt(0)) return ""+s.charAt(0);else return "";}this.s = s;this.t = t;String result = "";this.index = new HashMap<Character,Integer>();this.window = new HashMap<Character,Integer>();for(int i = 0 ; i<t.length() ; i++){this.index.put(t.charAt(i),index.getOrDefault(t.charAt(i),0)+1);}// 双指针法int left = 0;int right = 0;int minLen = len;while(right<len){// 首先移动右指针直至找到一个包含所有t字符的子串while(right<len && !check()){window.put(s.charAt(right),window.getOrDefault(s.charAt(right),0)+1);right++;}// 其次移动左指针直至无法找到一个包含所有t字符串的子串while(check()){window.put(s.charAt(left),window.getOrDefault(s.charAt(left),0)-1); // 负数不会影响结果left++;}// 处理if(minLen >= (right-left+1)){minLen = right-left+1;result = s.substring(left-1,right);// left-1到right的子串}}return result;}private boolean check(){Iterator iter = index.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Character key = (Character) entry.getKey(); Integer val = (Integer) entry.getValue(); if (window.getOrDefault(key, 0) < val) {return false;}} return true;}
}

该题利用双指针法,首先移动右指针,直到找到某一段s字符串含有t字符串所有字符的才停止移动,然后移动左指针,直到不满足该段s字符串中含有t字符串所有字符才停止移动,整个操作重复以上步骤,每次记录最小的result和最小长度。这里主要的难点就是:如何才能判断t字符串元素都包含在某一段s字符串中的所有元素中,笔者初次使用数组,发现卡在最后一个数据集,超时了,然后借鉴了官方的题解,利用HashMap结构,才通过的。详细请看代码,读者有疑问欢迎留言。

Leetcode 最小覆盖子串相关推荐

  1. Leetcode 76最小覆盖子串77组合78子集

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  2. 【LeetCode】【HOT】76. 最小覆盖子串(滑动窗口)

    [LeetCode][HOT]76. 最小覆盖子串 文章目录 [LeetCode][HOT]76. 最小覆盖子串 package hot;public class Solution76 {public ...

  3. LeetCode 76. 最小覆盖子串 (滑动窗口哈希表)

    LeetCode 76. 最小覆盖子串 思路: 准备一个map1记录字符串t(字符, 字符个数) 准备一个map2记录在s的窗口中所包含的t串字符(字符,字符个数) 左端点收缩条件:窗口内已经覆盖了t ...

  4. LeetCode高频题76. 最小覆盖子串:欠账还债还款问题,子串考虑i开头的情况所有答案更新一波

    LeetCode高频题76. 最小覆盖子串:欠账还债还款问题,子串考虑i开头的情况所有答案更新一波 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从 ...

  5. 【LeetCode】76. 最小覆盖子串 (Java代码)

    [LeetCode]76. 最小覆盖子串 (Java代码) 来源:力扣(LeetCode) 题目链接:https://leetcode.cn/problems/minimum-window-subst ...

  6. LeetCode第76题:最小覆盖子串(困难)

    LeetCode第76题:最小覆盖子串(困难) 题目:给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 解题思路:我认为题干说的有点不明确,刚开始我以为只要 ...

  7. LeetCode - 76 最小覆盖子串

    目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 76. 最小覆盖子串 - 力扣(LeetCode) 题目描述 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符 ...

  8. java最小子串覆盖_LeetCode 76. 最小覆盖子串

    LeetCode 76. 最小覆盖子串 题目 给你一个字符串 S.一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串. 示例: 输入: S = "ADOBECODEBAN ...

  9. 最小覆盖子串(Hard)

    目录 最小覆盖子串(滑动窗口+字典) Problem Description Sample Input Sample Output Hint Solution Code 最小覆盖子串(滑动窗口+字典) ...

最新文章

  1. R使用lm构建单变量线性回归模型
  2. DFT实训教程笔记3(bibili版本)-SOC Scan Implementtation Scan Practice Session II
  3. 申请补办 CET(纸笔考试)成绩证明的方法
  4. duilib学习领悟(4)
  5. composer windows安装
  6. spring事务源码解析
  7. opencv源码解析之(5):CommandLineParser类的简单理解
  8. 前端小白案例-爱新鲜抽屉式特效制作
  9. LINUX上传下载小工具lrzsz
  10. MATLAB求图像的均值、中值、众数、方差、协方差、相关系数
  11. 微信公众号开发框架 For Java —— wechatapi
  12. Liferay layout_configuration 分析
  13. 微信公众号正式号网络授权域名操作
  14. 绕过“请在微信客户端打开链接”如微师下载视频等。
  15. Good Luck in CET-4 Everybody! HDU - 1847 (巴氏博弈)
  16. 软件测试中文电子版姚静_软件测试[(美)ron patton]读书笔记
  17. mysql查询sql中日期为当天的记录_SQL 查询当天,本月,本周的记录 sql 查询日期...
  18. 【Linux】一些命令
  19. html垂直居中的方法
  20. 大数据-zookeeper

热门文章

  1. 15套高级程序设计----程序设计题(含12年--17年期末题)
  2. Python:多指标权重确定方法—熵值法
  3. 从0开始认识android(六):启动系统相机拍照、摄像的Intent
  4. 【区块链】Python开发EOS机器人与WAX链游脚本常用工具
  5. Zotero+坚果云打造多设备同步的文献管理工具(保姆级教程)
  6. Linux环境下使用Postfix和Dovecot搭建邮件系统
  7. 自己做量化交易软件(23)小白量化之MetaTrader5自动交易2
  8. PYQT Pushbutton 右键菜单
  9. 17岁少年闭门上网1年呈现精力决裂
  10. 【5G UP】5G QoS特性那点事儿