zoukankan      html  css  js  c++  java
  • [leetcode]Distinct Subsequences

    Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S.

    A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is a subsequence of "ABCDE" while "AEC" is not).

    Here is an example:
    S = "rabbbit"T = "rabbit"

    Return 3

    算法思路:

    思路1:递归,求出所有长度为t.length()的子串,相比会超时

    思路2:DP;dp[i][j]代表从s[0..i]中删除s.length - t.length个字符得到t[0..j]的不同删除方法数。

    • 初始化:如果t为空,任意的s删除到t都是1种。
    • 如果S[i] = T[j], dp[i][j] = dp[i-1][j-1]+dp[i][j - 1]
    • 如果S[i] 不等于 T[j], dp[i][j] = dp[i][j - 1]

    代码如下:

     1 public class Solution {
     2     public int numDistinct(String s, String t) {
     3         if(s == null || t == null || s.length() < t.length()) return 0;
     4         int[][] dp = new int[t.length() + 1][s.length() + 1];
     5         for(int i = 0; i < s.length() + 1; i++){
     6             dp[0][i] = 1;
     7         }
     8         for(int i = 1; i < t.length() + 1;i++){
     9             char c = t.charAt(i - 1);
    10             for(int j = 1; j < s.length() + 1; j++){
    11                 if(s.charAt(j - 1) == c){
    12                     dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
    13                 }else{
    14                     dp[i][j] = dp[i][j - 1];
    15                 }
    16             }
    17         }
    18         return dp[t.length()][s.length()];
    19     }
    20 }
  • 相关阅读:
    shell--练习--简易计算器
    shell--运算符
    shell--传递参数
    PHP数学函数的练习
    PDO对数据库的操作
    PHP实现手机短信的验证
    ThinkPHP框架 _ 学习16
    ThinkPHP框架 _ 学习15
    ThinkPHP框架 _ 学习14
    ThinkPHP框架 _ 学习13
  • 原文地址:https://www.cnblogs.com/huntfor/p/3886175.html
Copyright © 2011-2022 走看看