您的位置:首页 > 其它

leetcode -- Minimum Window Substring

2013-09-04 17:01 204 查看
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.

[解题思路]

双指针问题,维护两个指针:start, end; 当start 和 end所围的字符串包含T时,此时将start尽可能往后移以寻找下一个window

本题一开始做不出来的问题在于如何移动start,即start移动的终止条件是什么?

line 27-28 是while循环的终止条件

public String minWindow(String S, String T) {
// Start typing your Java solution below
// DO NOT write main() function
if (S == null || T == null || S.length() == 0 || T.length() == 0) {
return "";
}
int[] needToFind = new int[256];
int[] hasFound = new int[256];

for (int i = 0; i < T.length(); i++) {
needToFind[T.charAt(i)]++;
}

int minWinLen = Integer.MAX_VALUE;
int count = 0, tLen = T.length();
int winBeg = 0, winEnd = 0;
for (int begin = 0, end = 0; end < S.length(); end++) {
if (needToFind[S.charAt(end)] == 0) {
continue;
}
hasFound[S.charAt(end)]++;
if(hasFound[S.charAt(end)] <= needToFind[S.charAt(end)]){
count ++;
}

if(count == tLen){
27                 while(needToFind[S.charAt(begin)] == 0 ||
28                         hasFound[S.charAt(begin)] > needToFind[S.charAt(begin)]){
if(hasFound[S.charAt(begin)] > needToFind[S.charAt(begin)]){
hasFound[S.charAt(begin)]--;
}
begin ++;
}

int winLen = end - begin + 1;
if(winLen < minWinLen){
winBeg = begin;
winEnd = end;
minWinLen = winLen;
}
}
}

if (count == T.length()) {
return S.substring(winBeg, winEnd + 1);
}

return "";
}


ref

http://leetcode.com/2010/11/finding-minimum-window-in-s-which.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: