博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长回文子字符串的长度
阅读量:6693 次
发布时间:2019-06-25

本文共 1337 字,大约阅读时间需要 4 分钟。

回文是指正着读和倒着读,结果相同,比如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
=2) return s.substr(start,maxlength); return NULL; }

 

转载于:https://www.cnblogs.com/guanling222/p/5361110.html

你可能感兴趣的文章
Racket里的方括号
查看>>
【强化学习】用pandas 与 numpy 分别实现 q-learning, saras, saras(lambda)算法
查看>>
C#后台解析 json 动态解析 通用(Dictionary)
查看>>
使用UrlRewriter进行Url重写的完整解决方案[转]
查看>>
在代码里访问HTC Diamond的倾斜传感器
查看>>
tcp和udp能否发送0字节的数据包
查看>>
IP协议详解之IP地址要领
查看>>
【VB6笔记-01】 读取Excel绑定到DataGrid
查看>>
Android 测试工具
查看>>
产品架构开发方法 分享记录
查看>>
Windows Azure Cloud Service (40) 使用VS2013的publishSettings文件,发布Cloud Service
查看>>
异常处理原则
查看>>
Visual SVN 2.0.1下载+破解
查看>>
ASP.NET服务器推送及前后台实时交互
查看>>
sql server游标
查看>>
UML设计初步 - 基本概念一(actor, use case)
查看>>
关于Python中的for循环控制语句
查看>>
《http权威指南》阅读笔记(二)
查看>>
Javascript特效代码大全(420个)(转)
查看>>
jQuery闭包之浅见,从面向对象角度来理解
查看>>