代码随想录第五十七天|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列

题目: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
进阶:
如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
代码随想录第五十七天|● 392.判断子序列 ● 115.不同的子序列_第1张图片

题目链接: 392.判断子序列
动态规划写法–编辑距离经典题目
如果当前字母不相同时 dp[i][j]=dp[i][j-1] 相当于把t中不相同的字母删除

class Solution {
    public boolean isSubsequence(String s, String t) {
//动态规划解法-编辑距离入门 相同的话 最长子序列是[i-1][j-1]+1
//不同的话 不考虑t的当前元素 也就是s[:i-1]t[:j-2]的值
        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()? true:false;
    }
}

115.不同的子序列

题目: 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 + 7 取模。
代码随想录第五十七天|● 392.判断子序列 ● 115.不同的子序列_第2张图片

题目链接: 115.不同的子序列
解题思路:
题目中 S长 T短
dp数组的含义:以i-1为结尾的S中有多少个j-1为结尾的T
递推公式:当S[i-1]与T[j-1]相同时 可以让S加入匹配也可以不让
递推表格:以s = “rabbbit”, t = "rabbit"为例
代码随想录第五十七天|● 392.判断子序列 ● 115.不同的子序列_第3张图片

代码实现:

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();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)){
                    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()];
    }
}

你可能感兴趣的:(代码随想录,算法,动态规划)