manacher算法处理最长的回文子串(二)
在上篇《manacher算法处理最长的回文子串(一)》解释了manacher算法的原理,接着给该算法,该程序在leetcode的最长回文子串中通过。首先manacher算法维护3个变量。一个名为radius[i]的数组,表示以i为中心轴承的回文子串的半径,如abcdcba中,字符d的下标为4,则他的radius[4]=3,下标的为0的a的半径为radius[0]=0,即中心轴不考虑其中。一个idx表示上一次以idx为中心轴的回文。如果当以i为中心的回文在以idx为中心的回文内。则idx不更新,否则处理完radius[i]后,需要把idx更新为i。最后一个rad维护idx能够包含最大的范围的下一个字符下标,事实上当i+radius[i]到到达rad时就需要更新idx。
代码:

1 class Solution {
2 public:
3 string longestPalindrome(string s) {
4 int n=s.size();
5 string str(2*n+1,'0');
6 bool flag=1;
7 int j=0;
8 int maxIdx=0;
9 for(int i=0;i<2*n+1;i++){
10 if(flag){
11 str[i]='#';
12 flag=false;
13 }else{
14 str[i]=s[j++];
15 flag=true;
16 }
17 }
18 vector<int> radius(2*n+1,0);
19 int idx=0;
20 int rad=1;
21 for(int i=1;i<2*n+1;i++){
22 if(i>=rad){
23 forceExtend(str,radius,idx,rad,i);
24 maxIdx=(radius[i]>radius[maxIdx]?i:maxIdx);
25 }else if(i<rad){
26 int j=2*idx-i;
27 int idx_radius=idx-radius[idx];
28 int j_radius=j-radius[j];
29 if(j_radius>idx_radius){
30 radius[i]=radius[j];
31 }
32 else if(j_radius<idx_radius){
33 radius[i]=idx+radius[idx]-i;
34 }else{
35 radius[i]=idx+radius[idx]-i;
36 int count=1;
37 while((i+radius[i]+count)<=str.size()&&(i-radius[i]-count)>=0&&str[i+radius[i]+count]==str[i-radius[i]-count])
38 count++;
39 radius[i]+=(count-1);
40 if(i+radius[i]>=rad){
41 idx=i;
42 rad=i+count;
43 }
44 }
45 maxIdx=(radius[i]>radius[maxIdx]?i:maxIdx);
46 }
47
48 }
49 string ret=getMaxSubString(str,maxIdx,radius[maxIdx]);
50 return ret;
51 }
52 void forceExtend(const string& str, vector<int>& radius,int &idx,int &rad,const int k){
53 int count=1;
54 while((k-count)>=0&&(k+count)<str.size()&&str[k-count]==str[k+count]){
55 count++;
56 }
57 radius[k]=count-1;
58 if(k+radius[k]>=rad){
59 idx=k;
60 rad=k+count;
61 }
62 }
63 string getMaxSubString(const string &str,const int k,const int r){
64 string ret(r,'0');
65 int j=0;
66 for(int i=k-r+1;i<=k+r;i+=2){
67 ret[j++]=str[i];
68 }
69 return ret;
70 }
71
72 };

manacher算法处理最长的回文子串(二)的更多相关文章
- manacher算法处理最长的回文子串(一)
引言 相信大家都玩过折叠纸张,如果把回文串相当于折叠一个A4纸,比如ABCDDCBA就是沿着中轴线(D与D之间)对折重合,那么这个就是一个回文串.或者是ABCDEDCBA的中轴线就是E,那么沿着中轴线 ...
- hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]
传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相 ...
- Manacher算法--O(n)回文子串算法
转自:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 O(n)回文子串算法 注:转载的这篇文章,我发现下面那个源代码有点bug... ...
- python经典算法题:求字符串中最长的回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- bzoj2565 最长双回文子串
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...
- LeetCode[5] 最长的回文子串
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- leetcode 5 查找最长的回文子串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...
- 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...
随机推荐
- 深入annotation
目标: 掌握@Target注释 掌握@Document注释 掌握@inherited注释 之前定义的annotation,如果没有明确声明,可以在任何地方使用: package 类集; @MyDefa ...
- 关于org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor的队列
今天查看源码发现spring的线程池是支持队列的: 并且队列支持的上限相当大: 当线程池的达到最大线程时,默认会把任务放在队列(内存)中,所以我们可以放心用这个东西来写日志了
- 中国版Azure支持那些版本号Linux
不在下述列表中的Linux表示尚未经过正式验证,并不意味着不能使用,客户能够通过自行上传镜像文件的方式使用其它Linux版本号,可是不保证是否遇到一些驱动或者兼容问题. 分发 版本号 上次验证时间 驱 ...
- LaTeX 中使用三级标题
需要在导言区加入命令:\setcounter{secnumdepth}{4} 而后: \section{一级标题} \subsection{二级标题} \subsubsection{三级标题}
- T-sql isnull函数介绍
今天在给同事调取数据的时候,同事反馈说数据偏少,我仔细检查,发现sql语句条件都正确,逻辑没哪里不对,最后经过仔细排查,才发现问题出在null字段上 表中有一列是允许为null值,比如查询名字不为测试 ...
- Win7各个版本之间的区别
Windows7包含6个版本,分别为Windows7 Starter(初级版).Windows7 Home Basic(家庭普通版).Windows7 Home Premium(家庭高级版).Wind ...
- C++ Primer笔记6_STL之泛型算法
1.泛型算法: 大多数算法定义在头文件algorithm中.标准库还在头文件numeric中定义了一组数值泛型算法 仅仅读算法: 举例: find函数用于找出容器中一个特定的值,有三个參数 int v ...
- atitti.atiNav 手机导航组件的设计
atitti.atiNav 手机导航组件的设计 1.1. 三大按键导航功能,back,menu ,home1 1.2. header页头组件,为移动页面顶部的导航条设计.1 1.3. 页头主题设计1 ...
- [华为机试练习题]5.IP地址推断有效性
题目 推断输入的字符串是不是一个有效的IP地址 具体描写叙述: 请实现例如以下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符 ...
- android逆向分析之smali语法
一 .smali数据类型 1.Dalvik字节码 Davlik字节码中,寄存器都是32位的,能够支持任何类型,64位类型(Long/Double)用2个连续的寄存器表示: Dalvik字节码有两种类型 ...