leetcode-76. Minimum Window Substring
题目L:
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
For example,
S = “ADOBECODEBANC”
T = “ABC”
Minimum window is “BANC”.
说起来比较简单但是实现的过程确比较复杂。而且目前应该也不是最简过程。
首先我先建立一个HashMap表,并累计所有t中的值,然后初始化窗口,如果遍历整s都没有找到合适的窗口则返回”“;
然后维护这个窗函数,不断向右移动左窗口,直到其窗口右边达到右边,寻找在此过程中的最小窗口。
返回最小的窗口
public class Solution {
public String minWindow(String s, String t) {
if(t.equals(""))return "";
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
for(int i = 0; i < t.length();i++){
map.put(t.charAt(i),map.containsKey(t.charAt(i))? map.get(t.charAt(i))+1:1);
}
int r = 0;
while(!verify(map) && r<s.length()){
if(map.containsKey(s.charAt(r))){
map.put(s.charAt(r),map.get(s.charAt(r))-1);
}
r++;
}
int l = 0;
String ret = s;
if(verify(map)){
ret = s.substring(0,r);
}else{
return "";
}
while(r<=s.length()){
while(verify(map)){
if(r-l<ret.length()) ret = s.substring(l,r);
if(map.containsKey(s.charAt(l))){
map.put(s.charAt(l),map.get(s.charAt(l))+1);
}
l++;
}
if(r<s.length() && map.containsKey(s.charAt(r))){
map.put(s.charAt(r),map.get(s.charAt(r))-1);
}
r++;
}
return ret;
}
private boolean verify(HashMap<Character,Integer> map){
for(int i : map.values())
if(i>0) return false;
return true;
}
}