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

    一、题目

      1、审题

      2、分析

        给出字符串 s, 字符串 t;判断 s 中包含 t 的个数,其中 s 中的字符可以间隔包含,但不可以字符交叉包含 t 的字符。

    二、解答

      1、思路: 

        方法一、

          采用 dp 进行实现。

          ①、新建二维数组, dp[t.length()+1][s.length+1],其中 dp[i+1][j+1] 表示  s 中前 j 个字符可以间隔匹配 t 的前 i 个字符的个数;

          ②、dp[0][j] = 1 (j != 0), 即 t 为空时,s 总能匹配一次。

          ③ dp[i][0] = 0; , 即 s 为空而 t 不为空时总无法匹配。

          ④、若 t.charAt(i) == s.charAt(j), 则 dp[i+1][j+1] = dp[i][j] + dp[i+1][j]; 即: s 前 j - 1 个字符匹配 t 前 i - 1 个字符的个数 + s 的前 j - 1 个字符匹配 t 的前 i 个字符的个数。

            否则 dp[i+1][j+1] = dp[i+1][j];

        public int numDistinct2(String s, String t) {
            
            // mem[i+1][j+1]: 表示  s 中第前 j 个字符可以匹配 t 的前 i 个字符的个数
            int[][] mem = new int[t.length()+1][s.length()+1];
            
            for(int j = 0; j <= s.length(); j++)
                mem[0][j]= 1;
            
            for (int i = 0; i < t.length(); i++) { //
                for (int j = 0; j < s.length(); j++) { //
                    if(t.charAt(i) == s.charAt(j)) 
                        mem[i+1][j+1] = mem[i][j] + mem[i+1][j];
                    else
                        mem[i+1][j+1] = mem[i+1][j];
                }
            }
            
            return mem[t.length()][s.length()];
        }
  • 相关阅读:
    [Shoi2007]Vote 善意的投票
    [CQOI2015]任务查询系统
    [SDOI2013]森林
    HttpClient 教程 (二)
    /system改成可写
    Netbeans 6.8 + apktool_2.0.0b9 动态调试smali文件
    把中文版NetBeans改成英文版
    ZjDroid工具介绍及脱壳详细示例
    grep过滤搜索
    android Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
  • 原文地址:https://www.cnblogs.com/skillking/p/9745039.html
Copyright © 2011-2022 走看看