A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie,
"ACE"
is a subsequence of "ABCDE"
while "AEC"
is not).
Here is an example:
S =
"rabbbit"
, T = "rabbit"
Return
3
.
public class Solution { public int numDistinct(String S, String T) { // DP problem // When you see string problem that is about subsequence or matching, // dynamic programming method should come to your mind naturally. // The key is to find the changing condition. // Let W(i, j) stand for the number of subsequences of S(0, i) in T(0, j). // If S.charAt(i-1) == T.charAt(j-1), W(i, j) = W(i-1, j-1) + W(i-1,j); Otherwise, W(i, j) = W(i-1,j). int[][] table = new int[S.length() + 1][T.length() + 1]; for (int i = 0; i < S.length(); i++) table[i][0] = 1; for (int i = 1; i <= S.length(); i++) for (int j = 1; j <= T.length(); j++) if (S.charAt(i - 1) == T.charAt(j - 1)) // e.g., S --- "abcaa" and T --- "bca" table[i][j] = table[i - 1][j] + table[i - 1][j - 1]; else // If both last characters don't equal, S without last character doesn't change result. table[i][j] = table[i - 1][j]; return table[S.length()][T.length()]; } }
I have a solution using less space:
ReplyDeletepublic class Solution {
public int numDistinct(String s, String t) {
if(s == null || t == null || t.length() == 0) return 0;
int[] dp = new int[t.length()];
for(int i = 0; i=0; j–){
if(c == t.charAt(j)){
dp[j] = dp[j] + (j!=0?dp[j-1]: 1);
}
}
}
return dp[t.length()-1];
}
}
URL: http://traceformula.blogspot.com/2015/08/distinct-subsequences.html