1. 程式人生 > >076 Minimum Window Substring 最小窗口子字符串

076 Minimum Window Substring 最小窗口子字符串

() min 示例 htm minimum clas .cn ring i++

給定一個字符串 S 和一個字符串 T,找到 S 中的最小窗口,它將包含復雜度為 O(n) 的 T 中的所有字符。
示例:
S = "ADOBECODEBANC"
T = "ABC"
最小窗口是 "BANC".
註意事項:
如果 S 中沒有覆蓋 T 中所有字符的窗口,則返回空字符串 ""。
如果有多個這樣的窗口,你將會被保證在 S 中總是只有一個唯一的最小窗口。
詳見:https://leetcode.com/problems/minimum-window-substring/description/

class Solution {
public:
    string minWindow(string s, string t) {
        if (t.size() > s.size())
        {
            return "";
        }
		string res = "";
		int left = 0;
		int count = 0;
		int minLen = s.size() + 1;
		unordered_map<char, int> m;
		for (int i = 0; i < t.size(); i++)
        {
            if (m.find(t[i]) != m.end())
            {
				++m[t[i]];
            }
			else
            {
                m[t[i]] = 1;
            }
        }
		for (int right = 0; right < s.size(); right++)
        {
            if (m.find(s[right]) != m.end())
            {
				--m[s[right]];
				if (m[s[right]] >= 0)
                {
                    ++count;
                }
				while (count == t.size())
				{
					if (right - left + 1 < minLen)
					{
						minLen = right - left + 1;
						res = s.substr(left, minLen);
					}
					if (m.find(s[left]) != m.end())
					{
						++m[s[left]];
						if (m[s[left]] > 0)
                        {
                            --count;
                        }
					}
					++left;
				}
			}
        }
		return res;
    }
};

詳見:https://www.cnblogs.com/grandyang/p/4340948.html

076 Minimum Window Substring 最小窗口子字符串