Given a string S and a string T, count the number of distinct subsequences of T in S.
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
.
Have you met this question in a real interview?
这道题首先引用我忘记在哪里看到的一句话:
“When you see string problem that is about subsequence or matching, dynamic programming method should come to your mind naturally. ”
所以这种类型题可以多往DP思考思考。
思路不是很明显的时候,可以画图表。
画图之后,可以观察,得到规律:
左边是S,上面是 T.
matrix[i][j] 表示:S在i, T在j 的时候,S能够表示T的种数。
if S[i] != T[j] 的时候, matrix[i][j] = matrix[i-1][j] 也就是说,like: S abc T a, 当move到b的时候,b的个数就等于a which is 1, c的个数也等于a which is 1.
if S[i] == T[j] , matrix[i][j] = matrix[i-1][j] + matrix[i-1][j-1].这点是从图中
2 1
3
推理出来的。可以理解为: S[i] == T[j] 了,数目可以由原来的,各自倒退一步,S[i-1] T[j-1]的数目, + matrix[i-1][j]
因为matrix[i][j] 的数目,至少是matrix[i-1][j] 这个看矩阵第二列,也就是T=r那一列。全部是:
1
1
1
1
1
1
S = rabbit T = r
递推的base:
S="", T 这一行全部是0
T="", S 这一列全部是1,因为""为任何string的sequence,just delete this string will get ""
看不懂就看看这个: http://blog.csdn.net/abcbc/article/details/8978146
public class Solution {
public int numDistinct(String S, String T) {
if(S == null || T == null || T.length()>S.length()){return 0;}
int[][] matrix = new int[S.length()+1][T.length()+1];
// "" is 1 sequence of "";
matrix[0][0] = 1;
//init 1st col; T is "";
for(int i=1; i<S.length()+1; i++){
matrix[i][0] = 1;
}
//init 1st row; S is "";
for(int i=1; i<T.length()+1; i++){
matrix[0][i] = 0;
}
for(int i=1; i<S.length()+1; i++){
for(int j=1; j<T.length()+1; j++){
if(S.charAt(i-1) == T.charAt(j-1)){
matrix[i][j] = matrix[i-1][j]+matrix[i-1][j-1];
}else{
matrix[i][j] = matrix[i-1][j];
}
}
}
return matrix[S.length()][T.length()];
}
}