回文字符串

判断字符串是否是回文字符串

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;

    }

  

posted @ 2021-07-26 23:02  小林不会飞  阅读(127)  评论(0编辑  收藏  举报