题意是寻找一个字符串的最大回文字串,最简单的是n3方的算法,由于字符串最大长度为1000,所以这个方法很危险而且不科学。

紧接着想到的是一个n方的算法:回文子串是从中间向两边产生的,那么对于每个字符考察这个字符往外的所有可能不就可以找到以这个字符为中心的最长回文子串了吗?当然要考虑偶数的情况,即那个中心不在字母上,而这种情况的字符又一定满足中心的两个字符是相等的。所以在第一遍寻找奇数最长回文字符的时候记录下有可能形成偶数回文字符的数组下标,统一规定为两个字母下标较小的那个。

按照以上想法编码AC如下:

 class Solution {
public:
string longestPalindrome(string s) {
string resstring;
int maxlen=;
int maxindex=;
int n=s.length();
int doublestring[];
if(n==)
return s;
for(int i=;i<n;i++)
{
int index=i;int delt=;
if(index-delt>=&&s[index-delt]==s[index])
doublestring[index-]=;
if(index+delt<n&&s[index+delt]==s[index])
doublestring[index]=;
while(index-delt>=&&index+delt<n){
if(s[index-delt]==s[index+delt])
{
if(delt*+>maxlen)
{
maxlen=delt*+;
maxindex=index;
}
delt++;
}
else
break;
}
}
int resa=maxlen; for(int i=;i<n;i++)
{
if(doublestring[i]!=)
{
int index1=i;
int index2=i+;
int delt=;
while(index1-delt>=&&index2+delt<n){
if(s[index1-delt]==s[index2+delt])
{
if(delt*+>maxlen)
{
maxlen=delt*+;
maxindex=index1;
}
delt++;
}
else
break;
}
}
}
if(maxlen==resa)
{
int start=maxindex-(maxlen-)/;
resstring.append(s,start,maxlen);
}
else
{
int start=maxindex-(maxlen-)/;
resstring.append(s,start,maxlen);
}
//cout<<resstring<<endl;
return resstring;
}
};

这个方法有几个需要注意的地方:

1.对于字符数目为1的字符,直接返回不需进行处理。

2.在第一遍寻找奇数回文的时候,delt为1时不要在循环里面判断是否有对称的结构,如果在里面对于“abb”这种样例就无法通过

3.在第二遍寻找偶数回文的时候,delt应该从0开始,而非从1开始,这样才能判断出“bb”的样例。

4.C++的string字符串的append函数好方便,起始位置start,长度n给出,可以直接复制。

以上是我做这个题目的方法,我估计这个题目可以用动态规划解决,想了一会未果。动态规划真是脑力活,自己做的动规也比较少。

http://blog.csdn.net/feliciafay/article/details/16984031

这里有一篇介绍这个问题动态规划解法,至于他提到的O(n)方法。。不敢细看。

另外关于最长回文字串流行的解法是使用后缀树这个数据结构来做。

关于后缀树应用在这个问题的介绍附一个靠谱链接:

http://blog.csdn.net/g9yuayon/article/details/2574781

大致思路是使用后缀树然后找LCA(最近公共祖先),我估计把这个搞明白也要一会,还是继续先刷题吧。

里面还提到了graphviz这个画图工具,好像比visio画程序图更好用的样子。

http://www.graphviz.org/

随意看了看这方面的介绍,发现用这个Drawing graphs with dot文档入门比较靠谱。

Longest Palindromic Substring - 一题多解的更多相关文章

  1. LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划

    题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...

  2. leetcode-【中等题】5. Longest Palindromic Substring

    题目 Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...

  3. leetcode 第五题 Longest Palindromic Substring (java)

    Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You may ...

  4. leetcode第五题--Longest Palindromic Substring

    Problem:Given a string S, find the longest palindromic substring in S. You may assume that the maxim ...

  5. 【LeetCode每天一题】Longest Palindromic Substring(最长回文字串)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  6. 【LeetCode算法题库】Day2:Median of Two Sorted Arrays & Longest Palindromic Substring & ZigZag Conversion

    [Q4] There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of th ...

  7. (python)leetcode刷题笔记05 Longest Palindromic Substring

    5. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...

  8. LeetCode第五题:Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  9. 刷题5. Longest Palindromic Substring

    一.题目说明 Longest Palindromic Substring,求字符串中的最长的回文. Difficuty是Medium 二.我的实现 经过前面4个题目,我对边界考虑越来越"完善 ...

随机推荐

  1. SQL Server 数据岸问题

    create table t2(x int constraint pk_t2 primary key);go insert into t2(x) values(1),(2),(3),(5),(7),( ...

  2. 如何使用Excel和Word编辑和打印条形码

    本文介绍如何使用Microsoft Office Excel 2007和Microsoft Office Word 2007进行条形码的编辑后,通过普通的办公打印机将条形码打印出来. 对于少量,简单的 ...

  3. sqlite 查询数据 不用回调

    int main( void ){    sqlite3 *db=NULL;    char *zErrMsg = 0;    int rc;    //打开数据库连接    rc = sqlite3 ...

  4. android HTTP发送及MD5加密收集

    发送部分: public void MyFunction{ HttpClient httpclient = new DefaultHttpClient(); //你的URL HttpPost http ...

  5. 模式匹配-KMP算法

    /***字符串匹配算法***/ #include<cstring> #include<iostream> using namespace std; #define OK 1 # ...

  6. Linux系统编程——进程调度浅析

    概述 操作系统要实现多进程.进程调度不可缺少. 有人说,进程调度是操作系统中最为重要的一个部分.我认为这样的说法说得太绝对了一点,就像非常多人动辄就说"某某函数比某某函数效率高XX倍&quo ...

  7. iOS网络开发-打造自己的视频客户端

    一.展示实现 效果      客户端:                                      服务器端:            二.创建表 create table CourseV ...

  8. 下 面 这 条 语 句 一 共 创 建 了 多 少 个 对 象 : String s="a"+"b"+"c"+"d";

    javac 编译可以对字符串常量直接相加的表达式进行优化, 不必要等到运行期去进行加法运算处理, 而是在编译时去掉其中的加号, 直接将其编译成一个这些常量相连的结果.题目中的第一行代码被编译器在编译时 ...

  9. C# 课堂总结3-语句

    一.顺序语句 二.条件,分支语句 1.if语句 关键是能够熟练运用 if的嵌套.要考虑好所有的情况. 如果说 条件是两种+情况相互对应的,那么就可以只用 if 与else .但必须要想好 每个else ...

  10. BZOJ 2821: 作诗(Poetize)( 分块 )

    分块,分成N^0.5块.O(N^1.5)预处理出sm[i][j]表示前i块中j的出现次数, ans[i][j]表示第i~j块的答案. 然后就可以O(N^0.5)回答询问了.总复杂度O((N+Q)N^0 ...