《leetcode-php》获取一个字符串中可以按顺序组成另一个字符串的方法数

给定一个字符串S和一个字符串T,计算S中的T的不同子序列的个数。 

字符串的子序列是由原来的字符串删除一些字符(也可以不删除)在不改变相对位置的情况下的剩余字符(例如,"ACE"is a subsequence of"ABCDE"但是"AEC"不是)
例如:

S ="rabbbit", T ="rabbit"
返回3

动态规划

二维的,原来有问题,已经改了

<?php
/**
 * @param $S
 * @param $T
 * @return int
 * 本道题对于S和T都是可以拆开的,而且必须按照顺序.
 * 先对T的第一个字符,确定第一个字符在S的每个位置会出现多少次,然后再判断下一个字符在之后的位置出现多少次
 */
function numDistinct($S, $T) {
    $numS      = strlen($S);
    $numT      = strlen($T);
    $arrOutput = array();
    $arrOutput[-1][-1] = 1;
    for ($j = 0; $j < $numS; $j ++) {
        $arrOutput[-1][$j] = 1;
    }
    for ($j = 0; $j < $numT; $j ++) {
        $arrOutput[$j][-1] = 0;
    }
    for ($i = 0; $i < $numT; $i ++) {
        for ($j = 0; $j < $numS; $j ++) {
            $arrOutput[$i][$j] = $arrOutput[$i][$j - 1];
            if ($S[$j] == $T[$i]) {
                $arrOutput[$i][$j] += $arrOutput[$i - 1][$j - 1];
            }
        }
    }
    return $arrOutput[$numT - 1][$numS - 1];
}
$S = 'babgbag';
$T = 'bag';
//$S = 'rabbbit';
//$T = 'rabbit';
$RET = numDistinct($S, $T);
print $RET;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值