首页 > 其他 > 详细

Leetcode 76.最小覆盖子串

时间:2018-12-23 00:47:50      阅读:231      评论:0      收藏:0      [点我收藏+]

最小覆盖子串

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

示例:

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

输出: "BANC"

说明:

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

 

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

技术分享图片

 

 

 1 import java.util.*;
 2 
 3 public class Solution {
 4     public static String minWindow(String s,String t){
 5         Map<Character,Integer> map=new HashMap<>();
 6         int min=Integer.MAX_VALUE;
 7         int minStart=0,minEnd=0;
 8         int count=t.length();
 9         for(char c:t.toCharArray()){
10             map.put(c,map.containsKey(c)?map.get(c)+1:1);
11         }
12         int left=0;
13         for(int right=0;right<s.length();right++){
14             char val=s.charAt(right);
15             if(map.containsKey(val)){
16                 map.put(val,map.get(val)-1);
17                 if(map.get(val)>=0){
18                     count--;
19                 }
20             }
21             while(count==0){
22                 if(right-left<min){
23                     min=right-left;
24                     minStart=left;
25                     minEnd=right;
26                 }
27                 char temp=s.charAt(left);
28                 if(map.containsKey(temp)){
29                     map.put(temp,map.get(temp)+1);
30                     if(map.get(temp)>0) count++;
31                 }
32                 left++;
33             }
34         }
35         return min==Integer.MAX_VALUE?"":s.substring(minStart,minEnd+1);
36     }
37 }

 

Leetcode 76.最小覆盖子串

原文:https://www.cnblogs.com/kexinxin/p/10163053.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!