最长回文子串——4种解法

参考地址:https://www.cnblogs.com/leoin2012/p/3984997.html

题记:

最近刚研究了动态规划,感觉确实是算法思想中比较晦涩深奥的一种,解法2就是用动态规划,一般都是用数组记录尝试过的解法结果,为后续的解法提供剪枝。对于这道题目,解法1,解法3的思路比较简单易懂。

解法1:用两个for循环找出所有子串,第三个for循环用于判断该子串是否为回文,是回文则且比已找到的回文串长就替换,算法时间效率为O(n^3)

解法3:用for循环遍历字符串的每一个字符,每找到一个字符就以此为中心,往两边拓展,看左右字符串是否相等。但是回文有两种类型,一种为奇数,一种偶数,如下:

奇数回文:aba

偶数回文:abba

所以要分成2种情况。算法时间效率为O(n^2)

 

原文:

之前注册过hihoCoder,现在看到推出编程字符串专题,有这个题目,自己写一下。

回文是指正着读和倒着读,结果一些样,比如abcba或abba。

题目是要在一个字符串中要到最长的回文子串。

1、暴力法

最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个。

求每一个子串时间复杂度O(N^2),判断子串是不是回文O(N),两者是相乘关系,所以时间复杂度为O(N^3)。

/**
     * @param String $s
     * @return String
     */
    function longestPalindrome($s) {
        $length = strlen($s);
        $maxlength = 0;
        $start = 0;
        if($length<=1){
            return $s;
        }
        for($i=0;$i<$length;$i++){
            for($j=$i+1;$j<$length;$j++){
                $tmp1 = 0;
                $tmp2 = 0;

                for($tmp1=$i,$tmp2=$j;$tmp1<$tmp2;$tmp1++,$tmp2--){
                    if($s[$tmp1]!=$s[$tmp2]){
                        break;
                    }
                }

                if($tmp1>=$tmp2 && $j-$i>=$maxlength){
                    $maxlength = $j-$i+1;
                    $start = $i;
                }

            }
        }

        if($maxlength>0){
           return  substr($s,$start,$maxlength);
        }else{
           return substr($s,0,1);
        }

    }

  

posted @ 2019-04-01 15:00  饶翠  阅读(441)  评论(0编辑  收藏  举报