给定一个字符串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;