392.判断子序列
解法:代码随想录
题目:- LeetCode
思路和718. 最长重复子数组差不多,dp单个格子代表common subsequence的长度。
最后加一个累积的length是否等于s的length
class Solution {
public boolean isSubsequence(String s, String t) {
int[][] dp = new int[s.length() + 1][t.length() + 1];
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j < t.length(); j++) {
if (s.charAt(i) == t.charAt(j)) {
dp[i + 1][j + 1] = dp[i][j] + 1;
} else {
dp[i + 1][j + 1] = dp[i + 1][j];
}
//System.out.print(dp[i + 1][j + 1] + " ");
}
//System.out.println(" ");
}
return dp[dp.length - 1][dp[0].length - 1] == s.length();
}
}
115.不同的子序列
解法:代码随想录
题目:- LeetCode
个人思路和题题解for loop遍历s和t内外颠倒,但是思路一致。
以eg1为例,t控制dp[]坐标,s控制dp[][]坐标
1.
dp[0]这一排初始化为1,因为当t为空集时有且只有一个solution。
dp[i][0这一列初始化为0,因为当s为空集时不可能有任何solution。
2.
dp公式为:
当s.charAt(j) == t.charAt(i)时, dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j];
一共有两个组成部分:
首先dp[i + 1][j + 1]的数量包含dp[i][j]的数量,并且包含dp[i + 1][j]的数量。
note:这题和上题单个格子所代表的不是length而是solution的个数(所以不是简单加一位length的问题)
class Solution {
public int numDistinct(String s, String t) {
int[][] dp = new int[t.length() + 1][s.length() + 1];
Arrays.fill(dp[0], 1);
for (int i = 0; i < t.length(); i++) {
for (int j = 0; j < s.length(); j++) {
if (s.charAt(j) == t.charAt(i)) {
dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j];
} else {
dp[i + 1][j + 1] = dp[i + 1][j];
}
//System.out.print(dp[i + 1][j + 1] + " ");
}
//System.out.println(" ");
}
return dp[t.length()][s.length()];
}
}