• 最长回文子串——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);
            }
    
        }
    

      

  • 相关阅读:
    Dubbo基础知识
    mongodb 备份还原
    如何快速同步hdfs数据到ck
    sed 删除命令
    Host key verification failed 问题解决
    es boolquery 的几种用法
    ck中如何查询同比环比
    mysql 触发器介绍
    clickhouse 批量删除分区
    kafka 数据清除机制
  • 原文地址:https://www.cnblogs.com/huaerr/p/10636458.html
Copyright © 2020-2023  润新知