代码随想录算法训练营 day55 | 392.判断子序列、115.不同的子序列

目录

  • 392.判断子序列
    • 思路
    • 代码
  • 115.不同的子序列
    • 思路
    • 代码

代码随想录

392.判断子序列

思路

思路:利用最长公共子序列,只有当最长公共子序列的长度等于s的长度,那么返回true
dp[i][j]表示字符串A从0-i-1与字符串B 从0-j的最长公共子序列的长度。
dp[0][0]=0
if(c1[i-1]==c2[j-1])
dp[i][j]=dp[i-1][j-1]+1
否则dp[i][j]=max(dp[i][j-1],dp[i-1][j])

代码

class Solution {
    public boolean isSubsequence(String s, String t) {
        int dp[][] = new int[s.length()+1][t.length()+1];
        char c1[] = s.toCharArray();
        char c2[] = t.toCharArray();

        for(int i =1;i<=s.length();i++){
            for(int j =1;j<=t.length();j++){
                if(c1[i-1]==c2[j-1])
                    dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]= Math.max(dp[i][j-1],dp[i-1][j]);

            }
        }

        return dp[s.length()][t.length()]==s.length();
    }
}

115.不同的子序列

思路

题解思路:
dp[i][j]表示字符串A从0-i-1中含有的字符串B从0-j-1的个数
如果第i-1和j-1元素相等,那么就有两种可能,考虑i-1的元素和不考虑i-1的元素含有的到第j-1的子序列个数。
if(c1[i-1]==c2[j-1])
dp[i][j] = dp[i-1][j-1]+dp[i-1][j]
else
dp[i][j]=dp[i-1][j]

代码

class Solution {
    public int numDistinct(String s, String t) {
        int dp[][] = new int[s.length()+1][t.length()+1];
        char c1[] = s.toCharArray();
        char c2[] = t.toCharArray();
        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(c1[i-1]==c2[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()];
    }
}

你可能感兴趣的:(算法,leetcode,数据结构)