Given strings S
and T
, find the minimum (contiguous) substring W
of S
, so that T
is a subsequence of W
.
If there is no such window in S
that covers all characters in T
, return the empty string ""
. If there are multiple such minimum-length windows, return the one with the left-most starting index.
Example 1:
Input:
S = "abcdebdde", T = "bde"
Output: "bcde"
Explanation:
"bcde" is the answer because it occurs before "bdde" which has the same length.
"deb" is not a smaller window because the elements of T in the window must occur in order.
Note:
- All the strings in the input will only contain lowercase letters.
- The length of
S
will be in the range[1, 20000]
. - The length of
T
will be in the range[1, 100]
.
思路:这题虽然过了,但是对index还是有疑问,不完全参考的这个:
class Solution {
public String minWindow(String S, String T) {
int m = T.length();
int n = S.length();
int[][] dp = new int[m + 1][n + 1];
// initial 1st row;
for(int j = 0; j <= n; j++) {
dp[0][j] = j;
}
// calculate matrix;
for(int i = 1; i <= m; i++) {
dp[i][0] = -1;
for(int j = 1; j <= n; j++) {
if(S.charAt(j - 1) == T.charAt(i - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = dp[i][j - 1];
}
}
}
// calculate result in last row;
int minlen = Integer.MAX_VALUE;
int start = -1;
int end = -1;
for(int j = 1; j <= n; j++) {
if(dp[m][j] != -1) {
if(j - dp[m][j] + 1 < minlen) {
minlen = j - dp[m][j] + 1;
start = dp[m][j];
end = j;
}
}
}
return minlen == Integer.MAX_VALUE ? "" : S.substring(start, end);
}
}