【 PHP 】取出一个字符串中长度最大的回文字符串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010324331/article/details/84289634

取出一个字符串中长度最大的回文字符串

<?php
	function func($str)
	{   
	    // 初始化最大回文序列中间坐标
	    $maxxy = 0;
	    // 初始化最大回文长度
	    $maxLength = 0;
	    // 初始化一个空数组存储每次的回文序列中间坐标(key)和回文长度(value)
	    $arr = [];
	    // 通过在每个字符的两边都插入一个特殊的符号,将所有的回文子串都转换成奇数长度;
	    // 在字符串的开始和结尾加入另一个特殊字符,这样就不用特殊处理越界问题
	    $newStr = "^#" . implode("#", str_split($str)) . "#\0";
	    // 递推,每次取一个数作为中间坐标
	    for ($i = 2; $newStr[$i] != "\0"; $i++) {
	    	// 每个中间坐标的初始回文长度为1
	        $arr[$i] = 1;
	        // 根据每个中间坐标往两头匹配是否相等
	        while ($newStr[$i - $arr[$i]] == $newStr[$i + $arr[$i]]) {
	        	// 每匹配成功一次,则当前坐标的最大回文长度加一
	            $arr[$i]++;
	        }
	        // 判断当前回文长度是否大于最大的回文长度,大于则进去if代码块更新最大回文次数和更新最大回文中间坐标
	        if ($arr[$i] > $maxLength) {
	            $maxLength = $arr[$i];
	            $maxxy = $i;
	        }
	    }
	    // 截取最大回文长度的字符串
	    $res = substr($newStr, $maxxy - $maxLength + 1, $maxLength * 2 - 1);
	    // 清除开始加入的字符并返回
	    return str_replace('#', "", $res);
	}
$str = "abcddcbwewqwqer";
echo func($str);
// 输出 :bcddcb
?>

猜你喜欢

转载自blog.csdn.net/u010324331/article/details/84289634