最长回文子字符串的长度

回文是指正着读和倒着读,结果相同,比如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;
}  
时间: 2024-08-11 07:36:40

最长回文子字符串的长度的相关文章

LeetCode-5:Longest Palindromic Substring(最长回文子字符串)

描述:给一个字符串s,查找它的最长的回文子串.s的长度不超过1000. Input: "babad" Output: "bab" Note: "aba" is also a valid answer. 我是采用动态规划解决此题的.官方的solutions中提供了几种思路,包括我使用的DP.这里摘要如下: 思路1: 将s反转得到s',然后查找s和s'的最长公共子串substring,那么substring就是最长回文子串.比如:s = "

Leetcode 5 Longest Palindromic Substring (最长回文子字符串)(动态规划)

Leetcode 5 题目描述 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. 例子 Example 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. Example 2: Inp

LeetCode 5 Longest Palindromic Substring(最大回文子字符串)

翻译 给定一个字符串S,找出它的最大回文子字符串. 你可以假定S的最大长度为1000, 并且这里存在唯一一个最大回文子字符串. 原文 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 暴力搜索,O(n

leetcode oj s_05 最长回文子串

1 /** 2 * 最长回文子字符串 3 * 4 * @author 林夕 5 */ 6 public class Solution { 7 8 public static void main(String[] args) { 9 // String s = 10 // "rgczcpratwyqxaszbuwwcadruayhasynuxnakpmsyhxzlnxmdtsqqlmwnbxvmgvllafrpmlfuqpbhjddmhmbcgmlyeypkfpreddyencsdmgxysctp

最长回文子串(动规,中心扩散法,Manacher算法)

题目 leetcode:5.?Longest Palindromic Substring 解法 动态规划 时间复杂度\(O(n^2)\),空间复杂度\(O(n^2)\) 基本解法直接看代码 class Solution { public: string longestPalindrome(string s) { int n = s.size(); vector<vector<bool>> dp(n, vector<bool>(n, true)); int rx, ry;

MANACHER最长回文算法

博客已经搬家,请前往http://gqqnbig.me/ 阅读格式良好的文章. 本文将一步一步构造Manacher算法,心急的一定看不懂!请先练习下面的习题. 探索最长回文串性质 题1:已知字符串以center为中心对称,求完整的字符串. abcd??? | center 答 abcdcba | center 题2:接上题,abcdcba后面还有一些字符,以center2为中心,最大对称半径[ref]半径大于等于1.[/ref]为7,求完整的字符串. 答根据center2的对称性质,可以知道字符

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

求最长回文子串:Manacher算法

主要学习自:http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html 问题描述:回文字符串就是左右对称的字符串,如:"abba",而最长回文子串则是字符串长度最长的回文子字符串,如"abbaca"的最长回文子串为"abba". 常规解法:显而易见采用嵌套循环的方式可以“暴力”结算出答案,其时间复杂度为O(n^2),而Manacher算法是一种更加

leetcode-5 最长回文子串(动态规划)

题目要求: * 给定字符串,求解最长回文子串 * 字符串最长为1000 * 存在独一无二的最长回文字符串 求解思路: * 回文字符串的子串也是回文,比如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]是回文串. * P