动态规划动态规划程序员

leetcode 727 dp+双指针

2019-01-13  本文已影响0人  Ariana不会哭
  1. dp:


    image.png
//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循环。
//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;
}
上一篇下一篇

猜你喜欢

热点阅读