题目
给定一个字符串 S 和一个字符串 T,求 S 的不同的子序列中 T 出现的个数。
一个字符串的一个子序列是指:通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(譬如,"ACE"是"ABCDE" 的一个子序列,而 "AEC" 不是)
下面是一个例子:
S = "rabbbit", T = "rabbit"
返回 3.
思路
动态规划题目
代码
public int numDistinct(String s, String t) {
int[][] dp = new int[s.length() + 1][t.length() + 1];
//dp[i][j]:表示s.substr(0,i)匹配t.substr(0,j)符合的值
for (int i = 0; i <= s.length(); i++) {
//当t为空时,s删除全部字符即可匹配,值为1
dp[i][0] = 1;
}
for (int i = 1; i <= s.length(); i++) {
for (int j = 1; j <= t.length(); j++) {
dp[i][j] = dp[i - 1][j]; //等于前面一个字符的匹配值
if (s.charAt(i - 1) == t.charAt(j - 1)) {
//如果当前ij字符匹配(当前s和t的最后一个字符串)
//可选可不选
dp[i][j] += dp[i - 1][j - 1];
}
}
}
return dp[s.length()][t.length()];
}
网友评论