回溯实现:
public class Solution {
public int numDistinct(String S, String T) {
// Start typing your Java solution below
// DO NOT write main() function
return work(S, T, 0, 0);
}
public int work(String S, String T, int si, int ti) {
if (ti >= T.length())
return 1;
if (si >= S.length())
return 0;
int c = T.charAt(ti);
int p = si-1;
int value = 0;
while ((p=S.indexOf(c, p+1)) > -1) {
value += work(S, T, p+1, ti+1);
}
return value;
}
}
可以Pass Judge Small,但Judge Large超时,这是显然的,时间复杂度为O(N^M),优化吧。。
换动态规划,最佳子问题D(i,j)为:
1. T[i] == S[j], D(i,j) = D(i, j-1) + D(i-1, j-1)
2. T[i] != S[j], D(i,j) = D(i, j-1)
递推法实现代码如下:
public class Solution {
public int numDistinct(String S, String T) {
// Start typing your Java solution below
// DO NOT write main() function
if (S.isEmpty())
return 0;
int[][] matrix = new int[T.length()][S.length()];
for (int i=0; i<T.length(); i++)
for (int j=i; j<S.length(); j++) {
matrix[i][j] = j>0 ? matrix[i][j-1] : 0;
if (T.charAt(i) == S.charAt(j)) {
matrix[i][j] += i>0 ? matrix[i-1][j-1] : 1;
}
}
return matrix[T.length()-1][S.length()-1];
}
}
运行结果:
Run Status:
Accepted!
Program Runtime: 596 milli secs
Program Runtime: 596 milli secs