您的位置:首页 > 编程语言 > C语言/C++

[LeetCode] Minimum Window Substring !

2014-08-02 21:59 453 查看
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.

 这道题开始没什么思路,感觉O(n)这个限制很变态。

后来参考了http://www.cnblogs.com/remlostime/archive/2012/11/16/2774077.html

“双指针思想,尾指针不断往后扫,当扫到有一个窗口包含了所有T的字符,然后再收缩头指针,直到不能再收缩为止。最后记录所有可能的情况中窗口最小的”

class Solution {
public:
string minWindow(string S, string T) {
//set<int> Tset;
int *count1 = new int [270]; //set to 0??
int *count2 = new int [270];

for (int i=0; i<270; i++)
{
count1[i] = count2[i] = 0;
}

for (int i=0; i<T.size(); i++)
{
count1[T[i]]++;
count2[T[i]]++;
}

int count = T.size();
int start = 0, end = 0;
int minstart = 0;
int minsize = INT_MAX;

for (end=0; end<S.size(); end++)
{
if (count1[S[end]] > 0)
{
count2[S[end]]--;
if (count2[S[end]] >= 0)
{
count--;
}
}
if (count == 0)
{
while (true)
{
if (count1[S[start]] > 0)
{
if (count2[S[start]] < 0) //<0 stand for that character in T in S has more than one.
{
count2[S[start]]++;
}
else
break;
}
start++;
}
if (end - start + 1 < minsize)
{
minsize = end - start + 1;
minstart = start;
}
}
}

if (minsize == INT_MAX)
return "";

string ret(S, minstart, minsize);

return ret;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode C++