zoukankan      html  css  js  c++  java
  • leetcode-115. Distinct Subsequences

    1、原题链接

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

    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.

    链接:https://www.nowcoder.com/questionTerminal/ed2923e49d3d495f8321aa46ade9f873
    来源:牛客网
    2、思路

     *  思路:dp题。
     *  状态定义:dp[i][j]代表s[0~j - 1]中T[0~i - 1]不同子串的个数。
     *  递推关系式:S[j-1]!= T[i-1]:  DP[i][j] = DP[i][j - 1] (不选择S中的s[j-1]字符)
     *              S[j-1]==T[i-1]: DP[i][j] = DP[i-1][j-1](选择S中的s[j-1]字符) + DP[i][j - 1](不选择S中的s[j-1]字符)
     *  初始状态:第0列:DP[i][0] = 1,第0行:DP[0][j] = 0
     */
    当s[j - 1] = t[i - 1]时,s[j - 1]要分两种情况,选或者不选本字符,所以是加和的关系。当s[j - 1] != t[i - 1]时,选择本字符的情况与不选择本字符情况一样dp[i][j - 1]
     
    3、代码实现
     1 class Solution {
     2 public:
     3     int numDistinct(string s, string t) {
     4       int ss = s.size() + 1;
     5         int st = t.size() + 1;
     6         int dp[st][ss];
     7         memset(dp, 0, st* ss* sizeof(int));
     8         for (int i = 0; i < ss; i++) {
     9             dp[0][i] = 1;
    10         }
    11         for (int i = 1; i < st; i++) {
    12             for (int j = 1; j < ss; j ++) {
    13                 if (s[j - 1] == t[i - 1]) {
    14                     dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1];
    15                 } else {
    16                     dp[i][j] = dp[i][j - 1]; 
    17                 }
    18             }
    19         }
    20         return dp[st - 1][ss - 1];
    21     }
    22 };

    4、优化

    在使用中不难发现该dp二维数组可以降维,注意改变数组元素值时由后往前

     1 class Solution {
     2 public:
     3 int numDistinct(string S, string T) {
     4     int len=T.size();
     5     vector<int> array(len+1);
     6     array[0]=1;
     7     for(int i=1;i<S.size()+1;i++){
     8         for(int j=min(i,len);j>0;j--){
     9             if(S[i-1]==T[j-1])
    10                 array[j]=array[j]+array[j-1];
    11         }
    12     }
    13     return array[len];
    14     }
    15 };

    5、api

    6、参考牛客网 https://www.nowcoder.com/questionTerminal/ed2923e49d3d495f8321aa46ade9f873

     
  • 相关阅读:
    批量导出数据库表(oracle)
    Neo4j安装配置(mac)
    项目实施计划方案
    分布式数据库笔记
    SQL优化——ORACLE
    INNER JOIN & OUTER JOIN
    sqlMap.xml配置文件中迭代一个集合的方式
    sql下的xml配置文件中特殊使用的sql语句编写
    将查询列表内容保存到excel表格中,并保存到相应的盘中
    Spring框架中AOP特性
  • 原文地址:https://www.cnblogs.com/shihuvini/p/7868845.html
Copyright © 2011-2022 走看看