leetcode 727 dp+双指针
2019-01-13 本文已影响0人
Ariana不会哭
-
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);
}
- 双指针:
这个速度可以达到最快,主要思路:找到最后一个匹配的下标--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;
}