392.判断子序列
这道题目算是 编辑距离问题 的入门题目(毕竟这里只是涉及到减法),慢慢的,后面就要来解决真正的 编辑距离问题了
class Solution {
public boolean isSubsequence(String s, String t) {
//dp[i][j] 表示考虑s的前i个字符和t的前j个字符时,我们能够得到的最大匹配长度
int dp[][] = new int[s.length() + 1][t.length() + 1];
for (int i = 1; i <= s.length(); i++) {
for (int j = 1; j <= t.length(); 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];
}
}
}
return dp[s.length()][t.length()] == s.length();
}
}
115.不同的子序列
class Solution {
public int numDistinct(String s, String t) {
//dp[i][j]:以i为结尾的s子序列中出现以j为结尾的t的个数为dp[i][j]。
int dp[][] = new int[s.length() + 1][t.length() + 1];
//表示两个空字符串之间有1种匹配方式
dp[0][0] = 1;
//dp[i][0] = 1(对所有i):表示空字符串t是任何字符串s的子序列的唯一方式,空字符串可以被认为是任何字符串的子序列
for (int i = 0; i <= s.length(); i++) dp[i][0] = 1;
for (int i = 1; i <= s.length(); i++) {
for (int j = 1; j <= t.length(); j++) {
if (s.charAt(i - 1) == t.charAt(j - 1)) {
//字符匹配:如果s[i-1] == t[j-1],则存在两种可能性:
//你使用s[i-1]字符来匹配t[j-1],这意味着你需要看看在s的前i-1个字符中有多少种方式可以形成t的前j-1个字符。这对应于dp[i-1][j-1]。
//你不使用s[i-1]字符来匹配t[j-1],即使它们相匹配。这意味着t的前j个字符需要在s的前i-1个字符中找到匹配。这对应于dp[i-1][j]。
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()];
}
}