392. 判断子序列
- 确定dp数组下标及其含义:dp[i][j]表示以下标i-1为结尾的字符串s和下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]
- 递推公式:if (s[i - 1] == t[j - 1])代表在t中找到的一个字符在s中也出现了;if (s[i - 1] != t[j - 1])代表t没找到匹配元素,继续往下匹配。
if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1]的基础上加1;如果不等于,此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1]; - 数组初始化:dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。
- 遍历顺序:从上到下从左到右
class Solution {
public boolean isSubsequence(String s, String t) {
int len1 = s.length();
int len2 = t.length();
int[][] dp = new int[len1+1][len2+1];
for(int i = 1; i <= len1; i ++){
for(int j = 1; j <= len2; j ++){
if(s.charAt(i-1) == t.charAt(j-1)){
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = dp[i][j - 1];
}
}
}
if(dp[len1][len2] == len1){
return true;
} else {
return false;
}
}
}
115. 不同的子序列
- 确定dp数组下标及其含义:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。
- 递推公式:这类问题我们要基本分析s[i - 1] 与 t[j - 1]相等和s[i - 1] 与 t[j - 1]不相等两种情况。
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() + 1; i++) {
for (int j = 1; j < t.length() + 1; j++) {
if (s.charAt(i - 1) == t.charAt(j - 1)) {
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()];
}
}