回文字符串
判断字符串是否是回文字符串
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;
}
踩过这个坑,还有下一个坑等着你,这一路就是给自己填坑,坑填多了,也就习惯了,直到这一路平坦了,也就无怨无悔了。

浙公网安备 33010602011771号