取出一個(gè)字符串中長(zhǎng)度最大的回文字符串
<?php
function func($str)
{
// 初始化最大回文序列中間坐標(biāo)
$maxxy = 0;
// 初始化最大回文長(zhǎng)度
$maxLength = 0;
// 初始化一個(gè)空數(shù)組存儲(chǔ)每次的回文序列中間坐標(biāo)(key)和回文長(zhǎng)度(value)
$arr = [];
// 通過(guò)在每個(gè)字符的兩邊都插入一個(gè)特殊的符號(hào)朵锣,將所有的回文子串都轉(zhuǎn)換成奇數(shù)長(zhǎng)度座每;
// 在字符串的開始和結(jié)尾加入另一個(gè)特殊字符疏魏,這樣就不用特殊處理越界問(wèn)題
$newStr = "^#" . implode("#", str_split($str)) . "#\0";
// 遞推陡厘,每次取一個(gè)數(shù)作為中間坐標(biāo)
for ($i = 2; $newStr[$i] != "\0"; $i++) {
// 每個(gè)中間坐標(biāo)的初始回文長(zhǎng)度為1
$arr[$i] = 1;
// 根據(jù)每個(gè)中間坐標(biāo)往兩頭匹配是否相等
while ($newStr[$i - $arr[$i]] == $newStr[$i + $arr[$i]]) {
// 每匹配成功一次,則當(dāng)前坐標(biāo)的最大回文長(zhǎng)度加一
$arr[$i]++;
}
// 判斷當(dāng)前回文長(zhǎng)度是否大于最大的回文長(zhǎng)度妻往,大于則進(jìn)去if代碼塊更新最大回文次數(shù)和更新最大回文中間坐標(biāo)
if ($arr[$i] > $maxLength) {
$maxLength = $arr[$i];
$maxxy = $i;
}
}
// 截取最大回文長(zhǎng)度的字符串
$res = substr($newStr, $maxxy - $maxLength + 1, $maxLength * 2 - 1);
// 清除開始加入的字符并返回
return str_replace('#', "", $res);
}
$str = "abcddcbwewqwqer";
echo func($str);
// 輸出 :bcddcb
?>