给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。
子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。
样例
给出S = "rabbbit", T = "rabbit"
返回 3
public class Solution {
public int numDistinct(String S, String T) {
if (S == null || T == null) return 0;
if (S.equals("") || T.equals("")) return 0;
//table[i][j]表示S[0~i]中有多少个T[0~j]的个数
int[][] table = new int[S.length()][T.length()];
//给table第一行赋值,意思是S[0]中有多少个T[0~j]
//显然,S[0]最多包含一个T[0],故table[0][1~n]都为0
if (S.charAt(0) == T.charAt(0)) {
table[0][0] = 1;
}
for (int i = 1; i < S.length(); i++) {
char s = S.charAt(i);
//给table[i][0]赋值,意思是S[0~i]中有多少个T[0]
if (s == T.charAt(0)) {
table[i][0] = table[i - 1][0] + 1;
} else {
table[i][0] = table[i - 1][0];
}
for (int j = 1; j < T.length(); j++) {
char t = T.charAt(j);
if (s == t) {
//如果用S[i]匹配T[j],那么S[0~i-1]敏感词有table[i-1][j-1]个T[0~j-1]
//如果不用S[i]匹配T[i],那么S[0~i]敏感词有table[i-1][j]个T[0~j]
table[i][j] = table[i - 1][j - 1] + table[i - 1][j];
} else {
//S[i]!=T[j]时,S[0~i]敏感词有table[i-1][j]个T[0~j]
table[i][j] = table[i - 1][j];
}
}
}
return table[S.length() - 1][T.length() - 1];
}
}