最长回文子串长度
2015-07-29 09:54
295 查看
/************************************************************************* * File Name: Solution.cpp * Description: * Author: Yuji CAO * Mail: caoyuji@sogou-inc.com * Created_Time: 2015-07-29 08时00分17秒 * Last modified: 2015-07-29 08时00分17秒 ************************************************************************/ #include<iostream> #include<stdio.h> #include<vector> #include<string> #include<map> #include<set> #include<string.h> using namespace std; void preProc(vector<char>& dat){ vector<char> datRet; datRet.push_back('#'); for(vector<char>::iterator it=dat.begin();it!=dat.end();++it){ datRet.push_back(*it); datRet.push_back('#'); } dat=datRet; } void postProc(vector<char>& dat){ vector<char> retDat; for(vector<char>::iterator it=dat.begin();it!=dat.end();++it){ if(*it!='#'){ retDat.push_back(*it); } } dat=retDat; } int proc(vector<char>& dat){ vector<int> p; p.resize(dat.size()); int maxR=0; int maxP=0; for(int i=0;i<dat.size();++i){ if(i<maxR){ int leftI=2*maxP-i; if(((2*leftI-p[leftI])>(2*maxP-maxR))&&(2*maxP-maxR>0)){ p[i]=p[leftI]-leftI+i; }else{ p[i]=maxR; int& curR=p[i]; while(2*i-curR>=0&&curR<dat.size()&&dat[curR]==dat[2*i-curR]){ curR++; } //if(dat[curR]!=dat[2*i-curR]) curR-=1; if(maxR<p[i]){ maxR=p[i]; maxP=i; } } }else{ p[i]=i; int& curR=p[i]; while(2*i-curR>=0&&curR<dat.size()&&dat[curR]==dat[2*i-curR]){ curR++; } //if(dat[curR]!=dat[2*i-curR]) curR-=1; if(maxR<p[i]){ maxR=p[i]; maxP=i; } } } int ret=p[0]-0; for(int i=0;i<p.size();++i){ printf("%3d",p[i]); if(p[i]-i>ret){ ret=p[i]-i; } } printf("\n"); return ret; } int getLongestPalindrome(vector<char>& dat){ preProc(dat); for(int i=0;i<dat.size();++i){ printf("%3d",i); } printf("\n"); for(auto ele:dat){ printf("%3c",ele); } printf("\n"); int ret=proc(dat); postProc(dat); return ret; } int main(){ char a[]="abcabcabdbac"; vector<char> dat(a,a+strlen(a)); int ret=getLongestPalindrome(dat); cout<<ret<<endl; return 0; }
分析
这个问题的关键点有两点:通过插入特殊字符使得偶数长度的回文转换为奇数长度的回文处理:
A B C A D A C D
#A#B#C#A#D#A#C#D#
充分利用回文的对称性, 在扫描的过程中当前位置很可能在一个已知的对称结构中,这时需要充分利用对称结构,来计算回文.
相关文章推荐
- 使用自增长键列值的统计信息
- java开发过程中对于乱码问题的解决方法
- 九成用户都在电视上玩游戏是种什么体验?
- PC上简单的的文件传输方法(主要是虚拟机)
- 网站性能优化的三重境界
- shiro使用手册
- 官方移动应用开发教程Rad Studio Mobile Tutorials Version XE8
- poj3295 -- Tautology--构造法
- (转)python学习笔记——Thread常用方法
- sizeof小览
- 用api函数打开串口,获取系统时间
- 《C#高级编程》【第八章】委托、lambda表达式和事件 -- 学习笔记
- Swift:subscript
- 四元数与欧拉角(yaw roll pitch)转换公式与推导,以及它们unity中的不同
- HDOJ 5316 Magician 线段树
- 前端规范(持续)
- 关于类似新浪微博的后台问题
- jquery中combobox多选模糊过滤完美版
- &
- 文章标题