zoukankan      html  css  js  c++  java
  • 最长回文子字符串的长度

    回文是指正着读和倒着读,结果相同,比如abcba或abba,题目是要在一个字符串中要到最长的回文子串

    首先我们可以考虑一般的情况,先从字符串中取出任意一个子串,判断其是不是回文字符串,这种方法可以称之为暴力求解法,故时间复杂度可以达到o(n3)

    代码如下所示:

    import java.util.*;
     
    public class Palindrome {
        //判断回文的函数
        public boolean isHuiWen(String A, int n){
            int k = n / 2;
            for (int i = 0; i < k; ++i)
            {
                if (A.charAt(i) != A.charAt(n-1-i))
                    return false;
            }
            return true;
        }
        public int getLongestPalindrome(String A, int n) 
        {
            int maxlen=0;
            for(int i=0 ;i< n ;i++)
            {
                for(int j=i+1 ;j<=n ;j++)
                {
                    //两层循环遍历出所有的子串,并且逐一判断是否是回文
                    if(isHuiWen(A.substring(i, j),j-i))
                    {
                        if(j-i>maxlen)
                            maxlen=j-i;
                    }
                }
            }
            return maxlen;
        }
    }

    当然我们也可以使用时间复杂度低一点的方法,譬如使用动态规划求解,回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。这样需要额外的空间O(N^2),算法复杂度也是O(N^2)。

    首先定义状态方程和转移方程:

    P[i,j]=0表示子串[i,j]不是回文串。P[i,j]=1表示子串[i,j]是回文串。

    string findLongestPalindrome(string &s)  
    {  
        const int length=s.size();  
        int maxlength=0;  
        int start;  
        bool P[50][50]={false};  
        for(int i=0;i<length;i++)//初始化准备  
        {  
            P[i][i]=true;  
            if(i<length-1&&s.at(i)==s.at(i+1))  
            {  
                P[i][i+1]=true;  
                start=i;  
                maxlength=2;  
            }  
        }  
        for(int len=3;len<length;len++)//子串长度  
            for(int i=0;i<=length-len;i++)//子串起始地址  
            {  
                int j=i+len-1;//子串结束地址  
                if(P[i+1][j-1]&&s.at(i)==s.at(j))  
                {  
                    P[i][j]=true;  
                    maxlength=len;  
                    start=i;  
                }  
            }  
        if(maxlength>=2)  
            return s.substr(start,maxlength);  
        return NULL;  
    }  
  • 相关阅读:
    javaScript删除对象、数组中的null、undefined、空对象、空数组方法
    js数组方法 改变原数组和不改变原数组的方法整理
    js时间戳与日期格式的相互转换
    [原创]jquery更换头像
    css样式大全(copy自一个大佬的博文)
    【原创】实现点击按钮更换表格皮肤效果
    Cookie和Seesion
    常用正则表达式
    【原创】javaWeb完成增删查改功能
    javaWeb完成注册功能
  • 原文地址:https://www.cnblogs.com/guanling222/p/5361110.html
Copyright © 2011-2022 走看看