字符串系列之最长回文子串

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

问题描述:

    给定一个字符串S=A1A2...An,要求找出其最长回文子串(Longest Palindromic Substring)。所谓回文子串就是S的某个子串Ai...Aj为回文。例如,对字符串S=abcdcbeba,它的回文子串有:bcdcb,cdc,beb,满足题目要求的最长回文子串为bcdcb。

推理思路:

1.由于回文可能由奇数个字符组成,也可能由偶数个字符组成。对奇数回文的处理比较直观,只需要以某个字符为中心,依次向两边扩展即可。因此,我们可以通过如下方式把对偶数回文的处理转换成对奇数回文的处理:在字符边界添加特殊符号。例如,对字符串aba,预处理后变成#a#b#a#;对字符串abba,预处理后变成#a#b#b#a。可以看出,不管是奇数回文,还是偶数回文,在与处理后都变成奇数回文。在找出与预处理后字符串的最长回文后,只需要去除所有的#即为源字符串的最长回文。

2.对寻找字符串某类子串的问题,最简单直观的想法就是穷举出所有子串一一进行判别。这里也不例外,当然时间复杂度也很高,为O(n^3)。

3.对该问题,我们可以进行一定程度的简化处理。既然回文是一种特殊的字符串,我们可以以源字符串的每个字符为中心,依次寻找出最长回文子串P0, P1,...,Pn。这些最长回文子串中的最长串Pi = max(P1, P2,...,Pn)即为所求。请看源码:

string find_lps_native(const string &str)
{int center = 0, max_len = 0;for(int i = 1; i < str.length()-1; ++i){int j = 1;//以str[i]为中心,依次向两边扩展,寻找最长回文Piwhile(i+j < str.length() && i-j >= 0 && str[i+j] == str[i-j])++j;--j;if(j > 1 && j > max_len){center = i;max_len = j;}}return str.substr(center-max_len, (max_len << 1) + 1);
}

4.可以看出,上面做法的复杂度为O(n^2)。相比穷举字符串的做法,已经降低了一个量级的复杂度。但是仔细想想,上面的算法还有改进空间吗?当然有!而且改进后能够把复杂度降低到O(n)!这就是大名鼎鼎的 Manacher’s Algorithm。请看下文分析:

    举例说明:对字符串S=abcdcba而言,最长回文子串是以d为中心,半径为3的子串。当我们采用上面的做法分别求出以S[1]=a, S[2]=b, S[3]=c, S[4]=d为中心的最长回文子串后,对S[5]=c,S[6]=b...还需要一一进行扩展求吗?答案是NO。因为我们已经找到以d为中心,半径为3的回文了,S[5]与S[3],S[6]与S[2]...,以S[4]为对称中心。因此,在以S[5],S[6]为中心扩展找回文串时,可以利用已经找到的S[3],S[2]的相关信息直接进行一定步长的偏移,这样就减少了比较的次数(回想一下KMP中next数组的思想)。优化的思想找到了,我们先看代码:

string find_lps_advance(const string &str)
{//find radius of all charactersvector<int> p(str.length(), 0);int idx = 1, max = 0;for(int i = 1; i < str.length()-1; ++i){if(max > i){p[i] = p[(idx << 1) - i] < (max - i) ? p[(idx << 1) - i]:(max - i);}while(str[i+p[i]+1] == str[i-p[i]-1])p[i] += 1;if(i + p[i] > max){idx = i;max = i+p[i];}}// find the character which has max radiusint center = 0, radius = 0;for(int i = 0; i < p.size(); ++i){if(p[i] > radius){center = i;radius = p[i];}}return str.substr(center-radius, (radius << 1) + 1);
}

    这里进行简单的解释:上述代码中有三个主要变量,它们代表的意义分别是:

     p:以S[i]为中心的最长回文串的半径为p[i]。

     idx:已经找出的能够右延伸最远距离的回文子串的起始位置。

     max:已经找出的能够右延伸最远距离的回文子串的结束位置。

     算法的主要思想是:先找出所有的p[i],最大的p[i]即为所求。在求p[j] (j>i)时,利用已经求出的p[i]减少比较次数。

     代码中比较关键的一句是:

 p[i] = p[(idx << 1) - i] < (max - i) ? p[(idx << 1) - i]:(max - i);

    在求p[i]时,如果max>i,则表明已经求出的最长回文中包含了p[i],那么与p[i]关于idx对称的p[ (idx << 1) - i]的最长回文子串可以提供一定的信息。看了两幅图大概就明白什么意思了:

    求二者的最小值是因为当前能够获取的信息都来自max的左侧,需要进一步比较,求出以S[i]为中心的最长回文串。

5.除了上述的几种做法外,还可以利用动态规划以及后缀树来进行求解。下次进行介绍。

    结束行文之前,补充一句,对于字符串类的问题,建议多画一画,寻找其中的规律。

 

参考文献:1.http://www.akalin.cx/longest-palindrome-linear-time

 

转载于:https://my.oschina.net/pathenon/blog/63575

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Host SMBus controller not enabled的解决方法

From: http://blog.csdn.net/starmlk/article/details/7982077 SMBus 目录 SMBus与I2C的差别SMBus 是 System Management Bus 的缩写&#xff0c;是1995年由Intel提出的&#xff0c;应用于移动PC和桌面PC系统中的低速率通讯。它主要是希望通过一条廉价并且功能强大的总线&…

【Bugly干货分享】微信文件微起底Ⅰ

Bugly 技术干货系列内容主要涉及移动开发方向&#xff0c;是由 Bugly 邀请腾讯内部各位技术大咖&#xff0c;通过日常工作经验的总结以及感悟撰写而成&#xff0c;内容均属原创&#xff0c;转载请标明出处 微信大家都在用&#xff0c;但微信的本地文件到底隐藏着什么样的信息呢…

由旋转矩阵求旋转中心

在图像的复合变化过程中&#xff0c;通常会用到Matrix矩阵&#xff0c;一般的过程是先构造仿射变换矩阵&#xff0c;然后对图像进行仿射变换&#xff0c;如&#xff1a;围绕点&#xff08;100&#xff0c;100&#xff09;旋转30度(sin 30 0.5 &#xff0c;cos 30 0.866)&…

git服务器搭建

本文主要记录在Ubuntu 16.04操作系统中搭建GitLab服务器的操作记录&#xff0c;以下是操作步骤&#xff08;主要参考资料&#xff1a;https://about.gitlab.com/downloads/#ubuntu1604&#xff09;。1.安装依赖包&#xff0c;运行命令sudo apt-get install curl openssh-server…

Ubuntu桌面版网络设置

先来说下我的经验吧&#xff0c;我觉得Ubuntu桌面版中网络配置最好的方法是用Network-Manager这个带界面的软件&#xff0c;因为桌面版中这个软件是自动启动的。理由如下&#xff1a; 1. 如果要把这个软件设置为开机时不启动&#xff0c;得执行&#xff1a;chkconfig network-…

ant-design之form-重置表单多个值

重置form表单中的某一个值或者一次重置多个值 watch: {databaseType: function(curr, old) {this.getMyTableData [];this.form.resetFields([databaseSource,"databaseName","tableName",""]);},},

2016matlab安装

百度云的下载链接&#xff08;永久有效&#xff09;链接&#xff1a;https://pan.baidu.com/s/1dGZB4q9 密码&#xff1a;pfl3Matlab用途&#xff1a;点击打开链接与网盘资源相对应的安装教程1.将网盘中的3个文件下载下来后&#xff0c;解压&#xff08;在当前路径下&#xff0…

Nginx_查看并发连接数

通过查看Nginx的并发连接&#xff0c;我们可以更清除的知道网站的负载情况。Nginx并发查看有两种方法&#xff08;之所以这么说&#xff0c;是因为笔者只知道两种&#xff09;&#xff0c;一种是通过 web界面&#xff0c;一种是通过命令&#xff0c;web查看要比命令查看显示的结…

解决vuex中store保存数据,刷新页面会清空得问题

1.在App.vue下加入 mounted() {window.addEventListener("unload", this.saveState);},methods: {saveState() {sessionStorage.setItem("state", JSON.stringify(this.$store.state));}}2.在store下的index.js文件下修改 state:sessionStorage.getItem(…

arm MMU详解

一、MMU的产生许多年以前&#xff0c;当人们还在使用DOS或是更古老的操作系统的时候&#xff0c;计算机的内存还非常小&#xff0c;一般都是以K为单位进行计算&#xff0c;相应的&#xff0c;当时的程序规模也不大&#xff0c;所以内存容量虽然小&#xff0c;但还是可以容纳当时…

二叉树的建立与三种遍历

树是一种数据结构&#xff0c;为什么叫它“树”&#xff0c;因为它倒过来就是一棵树 根在上&#xff0c;而叶在下 其概念主要有根、父、子、深、叶等&#xff0c; 如上图&#xff1a;A为这棵树的根 B为D的父&#xff0c;而D则为B的子 E、F、G互为兄弟, D也可以叫叶 这也是一棵深…

vue中如何设置和清除定时器setInterval

data中生明定时器 方法里使用和清除定时器

VMware10中安装Mac10.9.3

教程网上确实有&#xff0c;我主要参考这个&#xff1a;http://bbs.pcbeta.com/viewthread-1418055-1-1.html 但是我按它的步骤&#xff0c;用我自己下载的mac os x 10.9.3原版.dmg在启动系统时就是会失败&#xff0c;我试过提取里面的InstallESD.dmg(取了2次&#xff0c;第一…

cisco 交换机通过console 导入 IOS

准备说明&#xff1a; 电脑上安装有 SecureCRT 软件 导入 IOS&#xff1a; 第一步&#xff1a;使用 SecureCRT 连接上交换机。进入rommon 模式&#xff08;CtrlBreak组合键&#xff09; 第二部&#xff1a;设置波特率为115200.调整波特率&#xff0c;可以大大减少灌IOS的时间&a…

localStorage.getItem 往浏览器里面储存数据到本地localStorage

借鉴https://blog.csdn.net/aaa333qwe/article/details/79025336 往浏览器里面储存数据 localStorage.setItem(‘todos’, JSON.stringify(value)) 读取 const list JSON.parse(localStorage.getItem(‘todos’)) || []

ZOJ 1450 Minimal Circle 点集的最小圆覆盖

From: http://blog.csdn.net/zmx354/article/details/17076267 给定一个点集&#xff0c;求出能覆盖点集内所有点的半径最小的圆。包含点在圆上的情况。个人感觉算是比较麻烦的计算几何模板了。 在网上看了很多解题&#xff0c;大多数都摘抄自《求一个包含点集所有点的最小圆…

命令行选项解析函数(C语言):getopt()和getopt_long()

上午在看源码项目 webbench 时&#xff0c;刚开始就被一个似乎挺陌生函数 getopt_long() 给卡住了&#xff0c;说实话这函数没怎么见过&#xff0c;自然不知道这哥们是干什么的。于是乎百度了一番&#xff0c;原来是处理命令行选项参数的&#xff0c;的确&#xff0c;正规点的大…

夺命雷公狗ThinkPHP项目之----企业网站2之数据库的快速设计

我们在一个项目的时候&#xff0c;花费最多事件的估计还是数据库的时间了&#xff0c;我们的数据库暂时就这样设计好了&#xff1a; 暂时我们的数据库就这样设计好了用下先,建好后如下所示&#xff1a; 转载于:https://www.cnblogs.com/leigood/p/5411017.html