判断字符串是否是回文字符串
function isPalindrome($subs){ $len = strlen($subs); for($i=0; $i<(int)($len/2); $i++){ if($subs{$i} != $subs{$len-$i-1}){ return false; } } return true; }
$subs{$i}字符串开始值,
$subs{$len-$i-1}字符串末值
如:‘123321’,‘1234321’,这都是回文字符串
获取最长回文字符串
暴力揭发: function longestPalindrome($s) { $len = strlen($s); $tmps = ''; $max = 0; for($i=0 ; $i<$len; $i++){ //起始下标 for($j=$i+1; $j<=$len;$j++){ //长度 if(isPalindrome(substr($s,$i,$j)) && $j > $max){ $tmps = substr($s,$i,$j); $max = $j; } } } return $tmps; } function isPalindrome($subs){ $len = strlen($subs); for($i=0; $i<(int)($len/2); $i++){ if($subs[$i] != $subs[$len-$i-1]){ return false; } } return true; }
中心扩展法 把每个字母当成回文串的中心。考虑两种情况,长度为奇数和偶数 function longestPalindrome($s) { $n = strlen($s); if($n == ''){ return $s; } $start = 0; $maxlen = 0; for($i=0; $i<$n; $i++){ $len1 = isPalindrome($s,$i,$i);//奇数 $len2 = isPalindrome($s,$i,$i+1);//偶数 $len = max($len1,$len2); if($len > $maxlen){ $start = $i - ($len-1)/2; $maxlen = $len; } } return substr($s,$start,$len) ; } function expend($str,$i,$j){ $n = strlen($str); $l = $i; $r = $j; while($l>=0 && $r<$n && $str[$l] == $str[$r]){ $l-- ; $r++ ; } return $r-$l-1; }
马拉车算法 function longestPalindrome($s) { $T = $this->malache($s); $n = strlen($T); $C = $R = 0; $p = []; for($i=1; $i<$n-1; $i++){ $i_mirror = $C*2 - $i; if($R>$i){ $p[$i] = min($R-$i,$p[$i_mirror]); }else{ $p[$i] = 0; } while(($T[$i-1-$p[$i]]) == ($T[$i+1+$p[$i]]) ){ $p[$i]++; } if($i + $p[$i] > $R) { $C = $i; $R = $i + $p[$i]; } } $maxLen = 0; $centerIndex = 0; for ($i=1; $i<$n-1;$i++ ){ if($p[$i] > $maxLen){ $maxLen = $p[$i]; $centerIndex = $i; } } $start = ($centerIndex-$maxLen)/2; echo substr($s,$start,$maxLen); } function malache($str){ $n = strlen($str); if(!$str){ return "^$"; } $ret = '^'; for($i=0; $i<$n; $i++){ $ret .= '#'.$str[$i]; } $ret .= "#$"; return $ret; }