392.判断子序列
思路:
dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]
代码:
class Solution {
public boolean isSubsequence(String s, String t) {
int[][] dp = new int[s.length()+1][t.length()+1];
for(int i = 1; i <= s.length(); i++){
char c1 = s.charAt(i-1);
for(int j = 1; j <= t.length(); j++){
char c2 = t.charAt(j-1);
if(c1 == c2){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = dp[i][j-1];
}
}
}
if(dp[s.length()][t.length()] == s.length()) return true;
else return false;
}
}
需要注意的点:
115.不同的子序列
思路:
代码:
class Solution {
public int numDistinct(String s, String t) {
int[][] dp = new int[s.length()+1][t.length()+1];
for (int i = 0; i < s.length() + 1; i++) {
dp[i][0] = 1;
}
for(int i = 1; i <= s.length(); i++){
char c1 = s.charAt(i-1);
for(int j = 1; j <= t.length(); j++){
char c2 = t.charAt(j-1);
if(c1 == c2){
dp[i][j] = dp[i-1][j-1]+dp[i-1][j];
}else{
dp[i][j] = dp[i-1][j];
}
}
}
return dp[s.length()][t.length()];
}
}
需要注意的点:
初始化
文章介绍了如何使用动态规划方法解决两个字符串之间的子序列问题。在392题中,判断一个字符串s是否是另一个字符串t的子序列;在115题中,计算字符串s中有多少个不同的子序列与字符串t相同。两题均通过二维dp数组来存储中间状态并进行计算。

1102

被折叠的 条评论
为什么被折叠?



