zoukankan      html  css  js  c++  java
  • 动态规划—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"

    Return3.

    思路

    1. 初始化一个矩阵number[i][j]用来记录字符串T的前j个字符出现在字符串S的前i个字符的次数,当j=0时,令number[i][j]=1;

    2. 当S的第i个字符与T的第j个字符不同时,则说明S的第i个字符对number[i][j]没有影响,即number[i][j]=number[i-1][j];

    3. 当S的第i个字符与T的第j个字符不同时,则说明S的第i个字符对number[i][j]有影响,number[i][j]除了要算上原来的number[i-1][j],还要算上新的可能性,即number[i-1][j-1].

    例子

      0 r a b b i t
    0 1 0 0 0 0 0 0
    r 1 1 0 0 0 0 0
    a 1 1 1 0 0 0 0
    b 1 1 1 1 0 0 0
    b 1 1 1 2 1 0 0
    b 1 1 1 3 3 0 0
    i 1 1 1 3 3 3 0
    t 1 1 1 3 3 3 3

    代码

     1     public static int result(String str1, String str2){
     2         int len1 = str1.length(), len2 = str2.length();
     3         int[][] res = new int[len1+1][len2+1];
     4         for(int i=0;i<len1+1;i++){
     5             res[i][0] = 1;
     6         }
     7         for(int i=1;i<len1+1;i++){
     8             for(int j=1;j<len2+1;j++){
     9                 if(str1.charAt(i-1)!=str2.charAt(j-1))
    10                     res[i][j] = res[i-1][j];
    11                 else
    12                     res[i][j] = res[i-1][j]+res[i-1][j-1];
    13             }
    14             
    15         }
    16         return res[len1][len2];
    17     }
  • 相关阅读:
    app版本升级的测试点
    APP测试完整测试用例设计方法
    多条件组合查询---测试用例设计
    上传文件和导出的测试用例设计
    需求评审时,测试应该做什么?
    什么是PRD?
    什么是测试计划?
    由谁来编写测试计划?
    测试计划模板
    无法预览图片
  • 原文地址:https://www.cnblogs.com/jiqianqian/p/7461858.html
Copyright © 2011-2022 走看看