您的位置:首页 > 其它

leetcode: Minimum Window Substring

2013-05-29 22:30 441 查看
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.

class Solution {
public:
string minWindow(string S, string T) {
// Start typing your C/C++ solution below
// DO NOT write int main() function

string retString;

if (S.size() < T.size())
return retString;

map<char, int> Hash;
map<char, int> curHash;
int curCount = 0;

int curStartPos = -1;
int curEndPos   = -1;

int minStartPos = -1;
int minEndPos   = S.size()-1;

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

for (int i = 0; i < S.size(); i++)
{
if (Hash.count(S[i]))
{
if (curStartPos == -1)
{
curStartPos = curEndPos = i;
}
else
{
curEndPos = i;
}

curHash[S[i]]++; //这里有可能curHash[S[i]]的值比Hash[S[i]]的值还要大

if (curHash[S[i]] <= Hash[S[i]])
curCount++;

if (curCount == T.size())
{
while (curEndPos-curStartPos+1 > T.size())
{
if (Hash.count(S[curStartPos]))
{
if (curHash[S[curStartPos]] > Hash[S[curStartPos]])
{
curHash[S[curStartPos]]--;
}
else
{
break;
}
}
curStartPos++;
}

if (curEndPos-curStartPos < minEndPos-minStartPos)
{
minStartPos = curStartPos;
minEndPos   = curEndPos;
}
curHash[S[curStartPos]]--;
curStartPos++;
curCount--;
}
}
}

if (minStartPos != -1)
retString = S.substr(minStartPos, minEndPos-minStartPos+1);

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