leetcode 727 dp+双指针

作者: Ariana不会哭 | 来源:发表于2019-01-13 04:01 被阅读0次
    1. dp:


      image.png
    • code C++:
    //dp 112 ms
    string minWindow(string S, string T) {
        int m = S.size(), n = T.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1,-1));
        for (int i = 0; i < m; i++) {
            dp[i][0] = i;
        }
    
        int right = 0; int minL = INT_MAX; int start = 0;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (S[i-1] == T[j-1])
                    dp[i][j] = dp[i - 1][j - 1];
                else
                    dp[i][j] = dp[i - 1][j];
                if (j == n && dp[i][j] != -1 && minL > i - dp[i][j]) {
                    start = dp[i][j];
                    minL = i - dp[i][j];
                }
            }
        }
        return (minL==INT_MAX)? "": S.substr(start, minL);
    }
    
    1. 双指针:
      这个速度可以达到最快,主要思路:找到最后一个匹配的下标--right。回溯,找到最左匹配下标-left--i
      提高速度的重要依据 双重while循环。
    • code C++:
    //fastest 找到以后 逆推找left 16ms my
    string minWindow(string S, string T) {
        int m = S.size(), n = T.size(), minLen = INT_MAX, i = 0, j = 0;
        string ans = "";
        while (i < m) {
            if (S[i] == T[j]) {
                if (j == n-1) {
                    int right = i;
                    while (j >=0) {
                        while (S[i--] != T[j]);
                        j--;
                    }
                    ++i;
                    if (minLen>right - i+1 ) {
                        minLen = right - i + 1;
                        ans = S.substr(i, minLen);
                    }
                }
                j++;
            }
            ++i;
        }
        return ans;
    }
    

    相关文章

      网友评论

        本文标题:leetcode 727 dp+双指针

        本文链接:https://www.haomeiwen.com/subject/hzqkdqtx.html