day54

1、leetcode392 判断子序列

  1. 动规五部曲

    1. dp[i] [j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i] [j]

    2. 递推公式

      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];
      }
      
    3. 初始化

      • dp[0] [0] = 0
      • dp[1] [0] = 0
      • 初始化为0
    4. 遍历顺序

      • 从上到下,从左到右
    5. 举例

  2. 代码

    class Solution {
        public boolean isSubsequence(String s, String 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] = dp[i][j-1];
                    }
                }
            }
    
            return dp[s.length()][t.length()]==s.length();
    
        }
    }
    
  3. 双指针法

    class Solution {
        public boolean isSubsequence(String s, String t) {
            if(s.length()==0) {
                return true;
            }
    
            int slow = 0;
            for(int fast=0; fast<t.length() && slow<s.length(); fast++) {
                if(t.charAt(fast) == s.charAt(slow)) {
                    slow++;
                }
            }
    
            return slow==s.length();
    
    
        }
    }
    

2、leetcode115 不同的子序列

  1. 动规五部曲

    1. dp[i] [j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i] [j]

    2. 递推公式

      1. s[i - 1] 与 t[j - 1]相等

        1. 一部分是用s[i - 1]来匹配,那么个数为dp[i - 1] [j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1] [j-1]。

        2. 一部分是不用s[i - 1]来匹配,个数为dp[i - 1] [j]。(就是模拟在s中删除这个元素)

          dp[i] [j] = dp[i - 1] [j - 1] + dp[i - 1] [j];

      2. s[i - 1] 与 t[j - 1] 不相等

        • 不用s[i - 1]来匹配 dp[i] [j] = dp[i - 1] [j];
    3. 初始化

      1. dp[i] [0] = 1:把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1
      2. dp[0] [j] = 0:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。s如论如何也变成不了t。
      3. dp[0] [0] = 1
    4. 遍历顺序

      • 从上到下,从左到右
    5. 举例

  2. 代码

    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 j=1; j<=t.length(); j++) dp[0][j] = 0;
    
            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()];
        }
    }
    
posted @ 2023-03-09 17:08  黄三七  阅读(25)  评论(0)    收藏  举报