给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
https://leetcode.cn/problems/minimum-window-substring/description/
classSolution{privateintcalPos(char ch){if(ch >='A'&& ch <='Z'){return(ch -'A')+26;}return ch -'a';}publicStringminWindow(String s,String t){int m = s.length();int n = t.length();if(m < n){return"";}int[] a =newint[52];int[] b =newint[52];for(int i =0; i < n; i++){
b[calPos(t.charAt(i))]+=1;}int l =0, r =0;for(; r < n-1; r++){char ch = s.charAt(r);
a[calPos(ch)]+=1;}int resLen =Integer.MAX_VALUE;int resStart =-1;while(r < m){int pos =calPos(s.charAt(r));if(b[pos]<=0){
r+=1;continue;}
a[pos]+=1;while(contains(a, b)&& l <= r){if(r-l+1< resLen){
resLen = r-l+1;
resStart = l;}
a[calPos(s.charAt(l))]-=1;
l++;}
r++;}return resStart ==-1?"": s.substring(resStart, resStart + resLen);}privatebooleancontains(int[] a,int[] b){for(int i =0; i < a.length; i++){if(b[i]>0&& a[i]< b[i]){returnfalse;}}returntrue;}}