最小覆蓋子串
阿新 • • 發佈:2021-01-14
技術標籤:Leetcode
最小覆蓋子串
題目描述
程式碼
import java.util.*;
public class Solution {
/**
*
* @param S string字串
* @param T string字串
* @return string字串
*/
public String minWindow (String S, String T) {
// write code here
//記錄T中所有字元出現的次數
int[] map = new int[128];
for(int i=0; i<T.length(); i++){
map[T.charAt(i)]++;
}
//左右指標,end先查詢包含全部T字元,begin進行縮減子字串
int begin=0, end=0;
int count = T.length();
//記錄最小子字串的頭
int head = 0;
//視窗大小
int window = Integer.MAX_VALUE;
while(end < S.length()){
//每個出現的字元的次數都要減1,命中存在的字元,則比較的次數-1
if( map[S.charAt(end)]-- > 0){
count--;
}
end++;
//全部命中,begin移動
while(count == 0){
//尋找最小視窗
if(end - begin < window){
head = begin;
window = end - begin;
}
//若begin指向的字元剛好被命中完的狀態,則count+1
//同時,移除的字元需要回加1
if( map[S.charAt(begin)]++ == 0 ){
count++;
}
begin++;
}
}
return window==Integer.MAX_VALUE ? "" :S.substring(head,head+window);
}
}