思路:这题依旧比较容易,判断s是否是t的子序列,我们依然可以用前几天求共同子序列长度的方法来解决,只不过这题子序列固定为了s,最后求出来的长度如果是s的长度那么就可以匹配,如果不是那么就无法匹配,此外还需要在递推公式中做出一点修改,我们之前在做最长公共子序列的时候,当遇到不匹配的情况需要考虑两种情况 dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]); 而本题中是用整个s去匹配t,那么当不匹配时直接继承t的前一位即可 dp[i][j] = dp[i][j-1];
class Solution {
public boolean isSubsequence(String s, String t) {
if(t.length() < s.length()) return false;
// dp[i][j]表示以i-1和j-1结尾的相同子序列长度
int[][] dp = new int[s.length()+1][t.length()+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]+1;
}else {
// 不相等的时候直接继承t的上一位的dp值 s的则不用动
dp[i][j] = dp[i][j-1];
}
}
}
// 最后长度相等 说明匹配
if (dp[s.length()][t.length()] == s.length()) return true;
return false;
}
}