PHP 最长回文子序列程序

phpserver side programmingprogramming更新于 2025/8/29 10:22:17

什么是回文?

回文是指正读和倒读相同的单词、短语、数字或字符序列。换句话说,即使字符反转,它的内容也保持不变。

示例

  • "level"是回文,因为它从左到右和从右到左读起来都一样。

  • "racecar"是回文。

  • "12321"是回文。

  • "madam"是回文。

求最长回文子序列的 PHP 程序

设 X[0..n-1] 为长度为 n 的输入序列,L(0, n-1) 为 X[0..n-1] 的最长回文子序列的长度。 如果 X 的首尾字符相同,则 L(0, n-1) = L(1, n-2) + 2。 否则 L(0, n-1) = MAX (L(1, n-1), L(0, n-2))。

动态规划解决方案

<?php
// 基于动态规划的
// 解决 LPS 问题的 PHP 程序
// 返回 seq 中最长回文子序列的长度
//

// 一个实用函数,用于获取
// 两个整数中的最大值
// function max( $x, $y)
// { return ($x > $y)? $x : $y; }

// 返回 seq 中最长回文子序列的长度
// 函数 lps($str)
{
$n = strlen($str);
$i; $j; $cl;

// 创建一个表来存储
// 子问题的结果
$L[][] = array(array());

// 长度为 1 的字符串是
// 长度为 1 的回文
for ($i = 0; $i < $n; $i++)
    $L[$i][$i] = 1;
    
    // 构建表格。注意:
    // 表格下对角线的值
    // 是无用的,
    // 不会在过程中填充。
    // 这些值的填充方式
    // 类似于矩阵
    // 链式乘法 DP
    // cl 是子字符串的长度
	for ($cl = 2; $cl <= $n; $cl++)
	{
		for ($i = 0; $i < $n - $cl + 1; $i++)
		{
			$j = $i + $cl - 1;
			if ($str[$i] == $str[$j] &&
							$cl == 2)
			$L[$i][$j] = 2;
			else if ($str[$i] == $str[$j])
			$L[$i][$j] = $L[$i + 1][$j - 1] + 2;
			else
			$L[$i][$j] = max($L[$i][$j - 1],
							$L[$i + 1][$j]);
		}
	}

	return $L[0][$n - 1];
}

// 驱动代码
$seq = 'BBABCBCAB';
$n = strlen($seq);
echo "The length of the " .
	" longest palindromic subsequence is ", lps($seq);
?>

输出

The length of the longest palindromic subsequence is 7

当使用输入字符串"BBABCBCAB"执行给定代码时,其输出为最长回文子序列的长度为 7。这意味着在输入字符串"BBABCBCAB"中,存在一个长度为 7 的回文子序列,即 BABCBAB。 "BBBBB" 和 "BBCBB" 也是给定序列的回文子序列,但不是最长的。代码使用动态规划成功计算并返回了该长度。

结论

总之,提供的 PHP 代码实现了一个动态规划解决方案,用于查找给定字符串中最长回文子序列的长度。当使用输入字符串"BBABCBCAB"执行时,它正确地确定了最长回文子序列的长度为 7(BABCBAB)。然而,代码并没有明确提供子序列本身。它的工作原理是构建一个包含不同子字符串长度的表格,同时考虑字符匹配或不匹配的情况。该算法使用自下而上的方法高效地计算长度,并得到所需的输出。


相关文章