Leetcode76. Minimum Window Substring
这题挺难的,对着答案才写了出来。
看来双指针还是没那么容易的。
要归纳一下双指针都有哪些走法。
class Solution {
public String minWindow(String s, String t) {
if(s.length()==0||t.length()==0) return "";
//Tmap存储目标字符串各字符数目
Map<Character,Integer> Tmap = new HashMap<>();
for(int i=0;i<t.length();i++){
int count = Tmap.getOrDefault(t.charAt(i),0);
Tmap.put(t.charAt(i),count+1);
}
//目标字符串字符类数以及目前slidewindow中的字符类数,用于判断是否达到目标
int CharNumRequired = Tmap.size();
int CharNumCurrent = 0;
//左右指针,右先走,找到符合要求的slidewindow,左指针再走,找到最小的slidewindow
int left = 0,right = 0;
//目前最佳(window_length,left,right)
int[] ans = {-1,0,0};
//目前slidewindow中字符以及对应数目
Map<Character,Integer> windowCounts = new HashMap<>();
while(right<s.length()){
char cur = s.charAt(right);
int count = windowCounts.getOrDefault(cur,0);
windowCounts.put(cur,count+1);
if(Tmap.containsKey(cur)&&windowCounts.get(cur).intValue()==Tmap.get(cur).intValue())
CharNumCurrent++;
while(CharNumCurrent==CharNumRequired&&left<=right){
char cur2 = s.charAt(left);
if(ans[0]==-1||right-left+1<ans[0]){
ans[0]=right-left+1;ans[1]=left;ans[2]=right;
}
windowCounts.put(cur2,windowCounts.get(cur2)-1);
if(Tmap.containsKey(cur2)&&windowCounts.get(cur2).intValue()<Tmap.get(cur2).intValue())
CharNumCurrent--;
left++;
}
right++;
}
return ans[0]==-1?"":s.substring(ans[1],ans[2]+1);
}
}
Runtime: 23 ms, faster than 46.48% of Java online submissions for Minimum Window Substring.
Memory Usage: 40 MB, less than 19.44% of Java online submissions for Minimum Window Substring.

浙公网安备 33010602011771号