最小覆盖子串

给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。

示例:

输入: S = "ADOBECODEBANC", T = "ABC"

输出: "BANC"

说明:

  • 如果 S 中不存这样的子串,则返回空字符串 ""。
  • 如果 S 中存在这样的子串,我们保证它是唯一的答案。

思路:采用滑动窗口,窗口有左右边界,先通过扩展右边界找出一个包含T中所有字符的子串,然后收缩左边界,直到不能再收缩。记录此时的子串。然后收缩左边界,继续扩展右边界,直到再找到满足要求的子串,和上次的进行比较,保存更小的子串。返回执行,直到右边界到达S串尾,且左边界不能再收缩。

 import java.util.*;

 public class Solution {
public static String minWindow(String s,String t){
Map<Character,Integer> map=new HashMap<>();
int min=Integer.MAX_VALUE;
int minStart=0,minEnd=0;
int count=t.length();
for(char c:t.toCharArray()){
map.put(c,map.containsKey(c)?map.get(c)+1:1);
}
int left=0;
for(int right=0;right<s.length();right++){
char val=s.charAt(right);
if(map.containsKey(val)){
map.put(val,map.get(val)-1);
if(map.get(val)>=0){
count--;
}
}
while(count==0){
if(right-left<min){
min=right-left;
minStart=left;
minEnd=right;
}
char temp=s.charAt(left);
if(map.containsKey(temp)){
map.put(temp,map.get(temp)+1);
if(map.get(temp)>0) count++;
}
left++;
}
}
return min==Integer.MAX_VALUE?"":s.substring(minStart,minEnd+1);
}
}

最新文章

  1. Neutron分析(4)—— neutron-dhcp-agent
  2. z-index堆叠规则
  3. C# List根据某一字段排序 将字段相同的排序到一起
  4. 详解Bootstrap进度条组件
  5. C#排序算法的比较
  6. 给python类动态添加方法(method)
  7. Android - 位置定位(Location)服务(Service)类的基本操作
  8. CocoaPods停在Analyzing dependencies解决方案
  9. rabbitmq在mac上安装
  10. 使用 certbot 申请泛域名https证书
  11. Java地位被撼动?Java与JavaScript的趣事连载
  12. urlparse解析URL参数
  13. 文本在div中始终垂直居中
  14. ES6 Symbol数据类型和set-map 数据结构
  15. 2018-2019-2 20175317 实验一《Java开发环境的熟悉》实验报告
  16. 【原创】Windows上应用程序报错常用分析方法总结
  17. Python自动化编程-树莓派的介绍与使用(一)
  18. 开源中国/码云 README.md上传图片的爬坑记录
  19. ESP8266 wifi钓鱼
  20. Hadoop初期学习和集群搭建

热门文章

  1. angularjs2 不同组件间的通信
  2. (数论)51NOD 1135 原根
  3. [ZJOI2006]Book书架
  4. 最简单的SPA(单页应用)实现
  5. 关于ds添加datarow
  6. UVM基础之------uvm phases机制
  7. 在linux下运行mongodb
  8. codeforces_333B_水过
  9. Windows提高_2.3第三部分:内核区同步
  10. C++_运算符重载 总结