392.判断子序列
完成
代码
双指针法
class Solution {
public boolean isSubsequence(String s, String t) {
int si = 0;
int ti = 0;
while (si<s.length()&&ti<t.length()) {
if(s.charAt(si)==t.charAt(ti)) si++;
ti++;
}
return si>=s.length();
}
}
本题dp[i][j] 表示以i-1为结尾的字符串s,和以j-1为结尾的字符串t,相同子序列的长度,想清楚dp数组的含义后,就好做了。
class Solution {
public boolean isSubsequence(String s, String t) {
// dp[i][j] 表示以i-1为结尾的字符串s,和以j-1为结尾的字符串t,相同子序列的长度
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] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
return dp[s.length()][t.length()] == s.length();
}
}
115.不同的子序列
完成
思路:
dp[i][j] 代表以i-1为结尾的字符串s,和以j-1为结尾的字符串t,s的子序列中t出现的个数。
递推公式和初始化需要注意。
代码
class Solution {
public int numDistinct(String s, String t) {
// dp[i][j] 代表以i-1为结尾的字符串s,和以j-1为结尾的字符串t,s的子序列中t出现的个数
int[][] dp = new int[s.length()+1][t.length()+1];
// 初始化
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++) {
// bagg 与 bag
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()];
}
}