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

[LeetCode][Java] Minimum Window Substring

2017-05-25 16:54 211 查看

题目:

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.

题意:

给定一个字符串S 和一个字符串T,在字符串S中找出最小的窗体,这个窗体能够包括T中的全部的字符,时间复杂度要求为O(n).

举个样例:

S =
"ADOBECODEBANC"


T =
"ABC"


最下的窗体为"BANC"
.

算法分析:

// 双指针思想,尾指针不断往后扫,当扫到有一个窗体包括了全部T的字符,然后再收缩头指针。直到不能再收缩为止。

// 最后记录全部可能的情况中窗体最小的

AC代码:

public class Solution
{
public String minWindow(String S, String T)
{
HashMap<Character, Integer> hasFound = new HashMap<Character, Integer>();
HashMap<Character, Integer> needToFind = new HashMap<Character, Integer>();

for (int i = 0; i < T.length(); i++)
{
hasFound.put(T.charAt(i), 0);
if (needToFind.containsKey(T.charAt(i)))
{
needToFind.put(T.charAt(i), needToFind.get(T.charAt(i)) + 1);
}
else
{
needToFind.put(T.charAt(i), 1);
}
}
int begin = 0;
int minWindowSize = S.length();
String retString = "";

int count = 0;

for (int end = 0; end < S.length(); end++)
{
Character end_c = S.charAt(end);
if (needToFind.containsKey(end_c))
{
hasFound.put(end_c, hasFound.get(end_c) + 1);
if (hasFound.get(end_c) <= needToFind.get(end_c))
{
count++;
}
if (count == T.length())
{
while ((!needToFind.containsKey(S.charAt(begin)))||(hasFound.get(S.charAt(begin)) > needToFind.get(S.charAt(begin))))
{
if (needToFind.containsKey(S.charAt(begin)))
{
hasFound.put(S.charAt(begin),hasFound.get(S.charAt(begin)) - 1);
}
begin++;
}
if ((end - begin + 1) <= minWindowSize)
{
minWindowSize = end - begin + 1;
retString = S.substring(begin, end + 1);
}
}
}
}
return retString;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: