LeetCode Day55 392&115

80 阅读2分钟
392. 判断子序列
  1. 确定dp数组下标及其含义:dp[i][j]表示以下标i-1为结尾的字符串s和下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]
  2. 递推公式:if (s[i - 1] == t[j - 1])代表在t中找到的一个字符在s中也出现了;if (s[i - 1] != t[j - 1])代表t没找到匹配元素,继续往下匹配。if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1]的基础上加1;如果不等于,此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];
  3. 数组初始化:dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。
  4. 遍历顺序:从上到下从左到右
class Solution {
    public boolean isSubsequence(String s, String t) {
        int len1 = s.length();
        int len2 = t.length();
        int[][] dp = new int[len1+1][len2+1];
        for(int i = 1; i <= len1; i ++){
            for(int j = 1; j <= len2; 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];
                }
            }
        }

        if(dp[len1][len2] == len1){
            return true;
        } else {
            return false;
        }
    }
}
115. 不同的子序列
  1. 确定dp数组下标及其含义:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。
  2. 递推公式:这类问题我们要基本分析s[i - 1] 与 t[j - 1]相等和s[i - 1] 与 t[j - 1]不相等两种情况。

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() + 1; i++) { dp[i][0] = 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] + dp[i - 1][j];
            }else{
                dp[i][j] = dp[i - 1][j];
            }
        }
    }
    
    return dp[s.length()][t.length()];
}

}