Longest Palindromic Substring - 一题多解
题意是寻找一个字符串的最大回文字串,最简单的是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文档入门比较靠谱。
最新文章
- CYQ.Data V5 从入门到放弃ORM系列:教程 - MProc类使用
- No resource found that matches the given name &#39;Theme.AppCompat.Light 的完美解决方案
- AngularJs ngIf、ngSwitch、ngHide/ngShow
- 删除多个Safari书签
- MySQL安装最后一步apply security settings错误
- case,cast
- Linq JsRender
- 实现Bootstrap Carousel Fade Transition 淡入淡出效果
- 使用Enterprise Architecture绘制10种UML画画
- Junit单元测试的简单使用(主要是在spring框架下的项目)
- 使用pg_buffercache查看缓存区缓存
- Markdown 安装图解(破解汉化教程)
- JavaScript设计模式(6)-门面模式
- 【CQOI2017】【BZOJ4813】小Q的棋盘 DFS
- 《转》studio界面、快捷键
- UIImageView - BNR
- JQuery_自带的动画效果
- IAR 跳转路径错误
- 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
- [.net]线程基础
热门文章
- 无法打开 configsource 文件
- Linux发展历史大事编年表(截止2013年)
- spring+springMVC集成(annotation方式)
- delphi调用外部程序打开文件
- Advanced Customization of the jQuery Mobile Buttons | Appcropolis
- hdu 4741 Save Labman No.004 [2013年杭州ACM网络赛]
- Objective-C中math.h数学计算公式介绍
- c/c++中宏定义##连接符 和#符的使用
- Asp.net 提供程序模型
- Sql 字符串操作类COALESCE