您的位置:首页 > 编程语言 > Java开发

Minimum Window Substring Java

2014-08-18 09:21 288 查看
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"
.

Note:

If there is no such window in S that covers all characters in T, return the emtpy string 
""
.

If there are multiple such windows, you are guaranteed that there will always be only one unique minimum window in S.

 Key to Solve: Two pointer Window's range method + HashMap,

    Similar idea with Substring with Concatenation of All Words & Longest Substring Without Repeating Characters

    1. Create a Map(key: Character, Value: Frequency) of T

    2. move right window's point while < S.length

    2. move left window's point under condition of full match were found

    3. optimize the min window string

    Time: O(2*N)=O(N)

    Space: O(L) L is size of T

public class Solution {
public String minWindow(String S, String T) {
String output="";
if(S.length()==0 || T.length()==0) return "";
HashMap<Character,Integer> map=new HashMap<Character, Integer>();
int matchCount=0;
int minLen=S.length()+1;
int left=0,right=0;

//create a Map
for(int i=0;i<T.length();i++){
char c=T.charAt(i);
if(map.containsKey(c)){
map.put(c,map.get(c)+1);
}else {
map.put(c,1);
}
}
while(right<S.length()) {
char c = S.charAt(right);
if (map.containsKey(c)) {
//System.out.println("c: "+c);
map.put(c, map.get(c)-1);
if (map.get(c) >= 0) {
matchCount++;
}
//Full Match were found
while (matchCount == T.length()) {
char cl=S.charAt(left);
if (map.containsKey(cl)) {
//record the character frequency
map.put(S.charAt(left), map.get(cl) + 1);
//optimize the min window String
if (map.get(cl)>0) {
if (minLen > right - left + 1) {
output = S.substring(left, right + 1);
minLen = right - left + 1;
}
matchCount--;
}
}
left++;
}
}
right++;    //skip un-relevant character
}
return output;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode