leetcode 727 dp+双指针

  1. dp:


    leetcode 727 dp+双指针_第1张图片
    image.png
  • code C++:
//dp 112 ms
string minWindow(string S, string T) {
    int m = S.size(), n = T.size();
    vector> dp(m + 1, vector(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+双指针)