1. 程式人生 > >Leetcode 76.最小覆蓋子串

Leetcode 76.最小覆蓋子串

ado 進行 stat pre con mage har hash 比較

最小覆蓋子串

給定一個字符串 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.最小覆蓋子串