给定一个字符串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;
本文介绍了一种使用动态规划算法来计算一个字符串作为另一个字符串的子序列出现次数的方法。通过构建二维数组,逐个比较两个字符串的字符,最终得出目标字符串在源字符串中不同子序列的总数。
655





