码迷,mamicode.com
首页 > 其他好文 > 详细

115. Distinct Subsequences

时间:2018-10-05 17:14:14      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:style   nbsp   png   维数   sequence   包含   turn   inf   ima   

一、题目

  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[i][0] = 1, 即 t 为空时,s 总能匹配一次。

      ③ dp[0][j] = 0;(j != 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()];
    }

 

115. Distinct Subsequences

标签:style   nbsp   png   维数   sequence   包含   turn   inf   ima   

原文地址:https://www.cnblogs.com/skillking/p/9745039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!