Manacher算法

Manachar算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊字符,因此原本长度为偶数的回文串就成了以中间特殊字符为中心的奇数长度的回文串了。       ------摘自百度百科

    奇偶变换:为处理字符串方便,现将给定的任意字符串进行处理,使所有可能的奇数/偶数长度的回文子串都转换成了奇数长度。具体就是在每个字符的两边都插入一个特殊的符号。比如hhjj变成 #h#h#j#j#, aba变成 #a#b#a#;为防止数组越界,可以在字符串的开始加入另一个特殊字符,比如“?#a#b#a#?” 。

用p[i]表示以第i个字符为中心轴,两边字符轴对称的最大半径。如下图所示,例如p[5]=3,p[7]=6。该算法利用已知的回文字串信息推断下一个回文字串的长度,判断当前字符是否包含在之前的回文字串中,若不包含在其中,令p[i]=1;否则做进一步的推断。

aaarticlea/png;base64,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" alt="" />

定义变量mid为前面长度能够延伸到最右边的回文子串的中心轴位置,定义最大右边界right = i + mid,即最大右边界表示以mid为中心的回文子串最右边位置的下一个位置。如下图

aaarticlea/png;base64,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" alt="" />

//定义变量j为i关于mid的对称位置,j=2*mid-1

一、right > i的情况

1) 当 right - i >= P[j] 的时候,以j为中心的回文子串包含在以为中心的回文子串中,因为 i 和 j 是对称的,所以以i为中心的回文子串必然包含在以mid为中心的回文子串中,所以必有 P[i] = P[j]。如下图

aaarticlea/png;base64,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" alt="" />

2)当 right - i < p[j] 的时候,以j为中心的回文子串不完全包含于以mid为中心的回文子串中,但是基于对称性可知,处于以mid为中心的回文子串的部分字符串是绝对匹配的,即以i为中心的回文子串向右至少会延伸到right的位置,也就是说 P[i] >= right - i,其后的部分是否是回文的,就要一个个判断了。

aaarticlea/png;base64,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" alt="" />

二、right > i的情况

right <= i,无法利用已知信息对以i为中心的回文字串做出判断,令P[i] = 1,然后一个个再去判断

以下为代码实现(C++)

 #include <iostream>
#include <cstring> using namespace std; string longestPalindrome(string s)
{ string str = "?#";
for(int i = ; i < s.size(); i++) //字符串长度奇偶变换,添加'$'防止数组越界
{
str += s[i];
str += "#";
}
str += "?";
//cout<<str; int p[str.size()-]={}; //定义p[i]数组 int right = , mid = ;
for(int i = ; i < str.size()-; i++)
{
if(right > i)
{
p[i] = (p[*mid - i] < (right - i) ? p[*mid - i] : (right - i)); //计算以i为中心的回文字串的最小长度
}
else
{
p[i] = ;
} while(str[i - p[i]] == str[i + p[i]]) p[i]++; //回文子串长度延伸 if(i + p[i] > right)
{
right = i + p[i];
mid = i;
} } int max = , middle=;
for(int i = ; i < str.size()-; i++) //生成最终结果
{
if(p[i] > max)
{
middle = i;
max = p[i];
}
}
max--; int start = middle - max ;
int end = middle + max;
string result;
for(int i = start; i <= end; i++)
{
if(str[i] != '#' && str[i] != '?')
{
result += str[i];
}
}
//cout<<result;
return result;
}

测试

 int main()
{
string s1="xschhsdr";
string s2="vffabbaabbbabaababbbacisd";
cout<<longestPalindrome(s1)<<endl;
cout<<longestPalindrome(s2)<<endl;
return ;
}

结果

Manacher算法解析的更多相关文章

  1. 图解最长回文子串「Manacher 算法」,基础思路感性上的解析

    问题描述: 给你一个字符串 s,找到 s 中最长的回文子串. 链接:https://leetcode-cn.com/problems/longest-palindromic-substring 「Ma ...

  2. manacher算法专题

    一.模板 算法解析:http://www.felix021.com/blog/read.php?2040 *主要用来解决一个字符串中最长回文串的长度,在O(n)时间内,线性复杂度下,求出以每个字符串为 ...

  3. Palindrome(poj3974)(manacher算法)

    http://poj.org/problem?id=3974 Palindrome Time Limit: 15000MSMemory Limit: 65536K Total Submissions: ...

  4. HDU 3068 最长回文 Manacher算法

    Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetc ...

  5. 【2018.07.28】(字符串/回文串)学习Manacher算法小记

    主要是应用在回文串啦,原理也理解了老半天,如果没有图片的话,我也看不太懂它的原理 学习的灵感来源来自于:https://segmentfault.com/a/1190000008484167 /* 最 ...

  6. HDU3068 回文串 Manacher算法

    好久没有刷题了,虽然参加过ACM,但是始终没有融会贯通,没有学个彻底.我干啥都是半吊子,一瓶子不满半瓶子晃荡. 就连简单的Manacher算法我也没有刷过,常常为岁月蹉跎而感到后悔. 问题描述 给定一 ...

  7. lintcode最长回文子串(Manacher算法)

    题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...

  8. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  9. 51nod1089(最长回文子串之manacher算法)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

随机推荐

  1. Accounting Flexfield Setup and Usage (Doc ID 124333.1)

    APPLIES TO:Oracle General Ledger - Version 11.5.10.2 to 12.1.3 [Release 11.5.10 to 12.1] Information ...

  2. H5学习之旅-H5的超链接以及图片链接(6)

    链接内容 1.文本链接 2.图片链接 属性 href:指向另一个文档的链接 name:文档内部的链接 img标签属性 alt:替换文本属性 width:宽 height:高 代码实例 <!DOC ...

  3. nginx 安装php

    1. 安装PHP 5.5.0 下载   1 2 cd /usr/local/src/ wget http://www.php.net/get/php-5.5.0.tar.bz2/from/jp1.ph ...

  4. HashMap与HashTable面试宝典

    u012233832的专栏 初生牛犊 目录视图 摘要视图 订阅 写博客,送money.送书.送C币啦   7-8月博乐推荐文章    砸BUG 得大奖 100%中奖率   微信开发学习路线高级篇上线  ...

  5. 开源摄影机:Axiom Camera

    一般情况下只有软件才有开源这个概念.这会儿发现了个很厉害的开源的产品:开源摄影机. 我还是第一次听说摄影机也可以开源.于是去该产品的官方网站了解了一下相关信息. 官网:http://axiom.ape ...

  6. 【Java编程】Eclipse快捷键

    Alt+左箭头,右箭头        以在编辑窗口切换标签 Alt+上下箭头,                以自动选择鼠标所在行,并将其上下移动 Ctrl+f6                    ...

  7. 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示

    在年前的一篇文章中,我提到要学习Qt.于是在这学期看了一个月的qt.现在大致对qt有了一些了解.但是现在导师又把我调到了android应用开发平台,所以说qt的学习要搁置了.本打算这学期做一个单词查询 ...

  8. ActionScript 3.0 API 中的 Video 类

    注:这个类在Flash流媒体开发中使用的很频繁,在此记录一下它的使用方法. 包 flash.media 类 public class Video 继承 Video  DisplayObject  Ev ...

  9. 滑动UITableViewCell出现多个按钮

    iOS > = 5.0使用第三方效果图 iOS> = 8.0使用系统方法效果图 MGSwipeTableCell(Github上的三方库)- iOS >= 5.0 直接使用比较简单 ...

  10. 关于iOS中几种第三方对XML/JSON数据解析的使用

    Json XML 大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式.一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特 ...