classSolution{// 思路:滑動窗口 + 雙指針。正確維護幾個變量十分重要// 復雜度:最多為O(2 * n) = O(n)publicStringminWindow(String s,String t){if(s ==null|| t ==null|| s.length()==0|| t.length()==0){return"";}// need:總是記錄當前窗口,每個字符還需的數量。負數為冗余數量int[] need =newint[128];for(char c : t.toCharArray()){need[c]++;}int count = t.length(), startIndex =0, minSize =Integer.MAX_VALUE;for(int l =0, r =0; r < s.length(); r++){if(need[s.charAt(r)]>0){count--;}need[s.charAt(r)]--;if(count ==0){// 去掉窗口前段的冗余元素,更新 leftwhile(l < r && need[s.charAt(l)]<0){need[s.charAt(l)]++;l++;}// 維護 minSizeif(r - l +1< minSize){minSize = r - l +1;startIndex = l;}// 繼續下一輪的窗口對比need[s.charAt(l)]++;l++;count++;}}return minSize ==Integer.MAX_VALUE ?"": s.substring(startIndex, startIndex + minSize);}}
二刷
實打實的滑動窗口維護!
總的來說還是幾個變量的維護,直接看代碼和注釋吧~
classSolution{publicStringminWindow(String s,String t){// 記錄字符需要的數量,負數冗余int[] need =newint[128];for(char c : t.toCharArray()){need[c]++;}int counts = t.length(), startIndex =0, minSize =Integer.MAX_VALUE;for(int l =0, r =0; r < s.length(); r++){// Part 1: 更新 counts && needif(need[s.charAt(r)]>0){counts--;}need[s.charAt(r)]--;// Part 2: 此時滿足的情況,更新窗口if(counts ==0){// Part 2.1:去除前面的冗余字符while(l < r && need[s.charAt(l)]<0){need[s.charAt(l)]++;l++;}// Part 2.2:維護 minSizeif(r - l +1< minSize){startIndex = l;minSize = r - l +1;}// Part 2.3:進行下一輪維護need[s.charAt(l++)]++;counts++;}}return minSize ==Integer.MAX_VALUE ?"": s.substring(startIndex, startIndex + minSize);}}