不同的子序列
题目描述:
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)题目数据保证答案符合 32 位带符号整数范围。
class Solution {
public int numDistinct(String s, String t) {
int m = s.length(), n = t.length();
if (m < n) {
return 0;
}
int[][] dp = new int[m + 1][n + 1];
// 初始化
for (int i = 0; i <= m; i++) {
dp[i][n] = 1; // 将任意字符串s转变为空字符串t只有一种方式
}
// 将任意空字符串s转变为任意字符串的方式为零种
// 动态规划过程
for (int i = m - 1; i >= 0; i--) {
char sChar = s.charAt(i);
for (int j = n - 1; j >= 0; j--) {
char tChar = t.charAt(j);
if (sChar == tChar) {
dp[i][j] = dp[i + 1][j + 1] // 选择s[i]和t[j]匹配
+ dp[i + 1][j]; // 选择s[i]不和t[j]匹配
} else {
dp[i][j] = dp[i + 1][j];
}
}
}
return dp[0][0];
}
}
一般字符串操作问题都是动态规划的思路,这里参考官方题解,定义存储数组dp[i][j]为从j开始到末端字符串t为从i开始到末端的字符串s匹配个数。详细请看代码,有疑问欢迎留言。