zoukankan      html  css  js  c++  java
  • 编程题:最长回文子串

    最长回文子串

    对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

    给定字符串A以及它的长度n,请返回最长回文子串的长度。

    考察点:字符串、动态规划

    思路1:遍历并往前往后查找以该节点i为中心节点回文子串

    1、涉及字符串中单个字符的操作,将字符串转成字符数组进行操作

    2、回文子串中心节点的格式可能是bab或者baab,根据这个进行一一遍历

        /*返回最长回文子串的长度*/
        /*
        1、字符串若是涉及单字符操作,转换成char数组处理效率更高
        2、方法一:通过交接点寻找,使用stack?
        */
        public int getLongestPalindrome(String A, int n) {
            /*找回文子串的交接点*/
            char[] chara = A.toCharArray();
            int max = 0;
            if(chara[1]==chara[0]) max=2;
            for(int i=2;i<n;i++){
                if(chara[i]==chara[i-1]){
                    int l=i-1,r=i;
                    while (l>=0&&r<n&&chara[l]==chara[r]){
                        l--;
                        r++;
                    }
                    max = Math.max(max,r-l-1);
                }
                if(chara[i]==chara[i-2]){
                    int l=i-2,r=i;
                    while (l>=0&&r<n&&chara[l]==chara[r]){
                        l--;
                        r++;
                    }
                    max = Math.max(max,r-l-1);
    
                }
    
            }
            return max;
        }

    思路2:动态规划

    一开始并不想构建动态规划,后面了解了一下,不知道构建动态规划矩阵是否对提升效率有帮助?

    若是构建动态规划矩阵,设置布尔矩阵dp[i][j] = 位置i到位置j的字符串是否回文子串,那么在判断str[i]和str[j]是否相等的前提,dp[i][j]是否为true与dp[i-1][j+1] 来判断。

    这个动态规划矩阵我们只关注左下角部分,可以发现黄色对角线都是true,

    而蓝色的位置,譬如A与它的右上角对角位置T‘相关,然而T’在我们关注的三角之外,所以可以默认为true只看A对应位置的两个字符对比。

    红色的位置B与它右上角对角位置相关,是为true的黄色位置

    紫色位置C与A‘相关,那么我们需要构建矩阵的顺序是从上到下,从右到左。

    如ccbcabaabba的回文子串矩阵如下

     

    解题2:

    排名前列的大佬们证明,好像动态规划解法对这道题反而不是最优算法

    if (A == null || A.length() < 2 || n < 2) return 1;
            int max = 1;
            boolean[][] dp = new boolean[n][n];
            char[] chara = A.toCharArray();
            for(int i=0;i<n;i++){
                for(int j=i;j>=0;j--){
                    if(i==j){ dp[i][j]=true;}
                    else if(j+1>i-1){
                       dp[i][j] = (chara[i]==chara[j]);
                    }
                    else {
                        dp[i][j] = dp[i-1][j+1]&&(chara[i]==chara[j]);
                    }
    
                    if(dp[i][j]){
                        //System.out.println(i+" "+j);
                        max = Math.max(max,i-j+1);
                    }
    
                }
            }
            return max;
    当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。
  • 相关阅读:
    孙陶然的五行文化,学习,真实用
    查看CPU使用率
    卸载windows补丁
    结束普通方法无法结束的进程
    三观
    如何知道一个EXE使用什么开发语言开发的
    文本文件处理,删除其中含有某些字符文本的行,一行命令搞定
    Delphi 字符串转日期,强大到窒息,VarToDateTime 解决了 困扰很久的小问题
    netstat -an查看到大量的TIME_WAIT状态的解决办法
    跨平台开发应用
  • 原文地址:https://www.cnblogs.com/liwxmyself/p/14708973.html
Copyright © 2011-2022 走看看