Minimum Window Substring

Minimum Window Substring 題解


題目描述

Minimum Window Substring
即尋找字符串S的最短子字符串s,使得s包含字符串T中的全部元素。
如:S="ADOBECODEBANC"T="ABC",知足條件的最短子字符串s="BANC"spa

題解

問題存在最優子結構性質。設f(i)表示字符串S的子字符串S[1:i]中包含字符串T中的全部元素的最短子字符串,suffix(j)表示字符串S的以S[j]爲末的子字符串S[h:j]中包含字符串T中的全部元素的最短子字符串。以上二者若不存在知足條件的子串則爲無窮長的字符串。那麼f(i+1)=minLen(f(i),suffix(j))code

此題中設字符串S長度爲n,字符串T長度爲m。答案即f(n)。狀態數n個,狀態轉移複雜度O(1)。而預處理字符串T以創建T中元素映射表只須要掃描一遍T便可。因爲是7位ASCII碼,所以映射表佔用空間爲常量(若不是ASCII碼,可換成通用哈希表進行映射,空間複雜度爲O(m))。所以此題整體時間複雜度爲O(max(m,n))。因爲解須要O(n)的空間,空間複雜度爲O(n)leetcode

代碼

class Solution {
    static const size_t ASCIISIZE = 128;
public:
    string minWindow(string s, string t) {
        int has[ASCIISIZE] = { 0 };
        size_t fill = t.size(), start = s.size(), end = s.size(), min = std::numeric_limits<size_t>::max();
        for (size_t i = fill; i--; )
            ++has[t[i]];
        for (size_t i = s.size(); i--; )
            if (has[s[i]]-- > 0)
                if (fill == 1) {
                    while (has[s[--end]]++ != 0) {}
                    size_t len = end - i + 1U;
                    if (len < min) {
                        min = len;
                        start = i;
                    }
                } else {
                    --fill;
                }
        return s.substr(start, min);
    }
};

總結

主要應用了動態規劃的思想。字符串

相關文章
相關標籤/搜索