python实现对求解最长回文子串的动态规划算法


Posted in Python onJune 02, 2018

基于Python实现对求解最长回文子串的动态规划算法,具体内容如下

1、题目

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

示例 1:

输入: "babad"
输出: "bab"

注意: "aba"也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

2、求解

对于暴力求解在这里就不再骜述了,着重介绍如何利用动态规划算法进行求解。

关于动态规划的含义及用法,请参考链接,这篇文章通过漫画的形式对动态规划算法进行了详细而又有风趣的介绍。值得一看。

2.1 算法一

利用常规动态规划算法,即利用表来存储每一中回文子串的可能。

基于动态规划的三要素对问题进行分析,可确定以下的状态转换方程:

python实现对求解最长回文子串的动态规划算法

其中f(i,j)表示当s[i:j]子串是否是回文串。当j-i<=1时,如果s[i] == s[j]则表示s[i:j]为回文串,及f(i,j) = true,否则f(i,j) = false。当j-i > 1时,则判断 s[i]、s[j]是否相等以及f(i+1, j-1)是否为true,即s[i+1:j-1]是否为回文串,如果为真,则f(i,j) = true

所以就需要一个n*n的二维矩阵用于存储f(i,j)的值,其中 j in range(0, k),i in range(0, j+1),之所以是j+1是因为i可以等于j。

python3代码如下:

k = len(s) # 计算字符串的长度 
 matrix = [[0 for i in range(k)] for i in range(k)] # 初始化n*n的列表 
 logestSubStr = "" # 存储最长回文子串 
 logestLen = 0 # 最长回文子串的长度 
 
  for j in range(0, k): 
   for i in range(0, j+1): 
    if j - i <= 1: 
     if s[i] == s[j]: 
      matrix[i][j] = 1   # 此时f(i,j)置为true 
      if logestLen < j - i + 1: # 将s[i:j]的长度与当前的回文子串的最长长度相比 
       logestSubStr = s[i:j+1] # 取当前的最长回文子串 
       logestLen = j - i + 1 # 当前最长回文子串的长度 
    else: 
     if s[i] == s[j] and matrix[i+1][j-1]: # 判断 
      matrix[i][j] = 1 
      if logestLen < j - i + 1: 
       logestSubStr = s[i:j+1] 
       logestLen = j - i + 1 
  return logestSubStr

 采用当前算法,时间复杂度为O(n*n),空间复杂度为O(n*n),算法平均耗时大概5~7s

下面介绍空间复杂度为O(n)的算法。

2.2 算法二

算法二是由算法一改良而来,观察算法一的执行流程如下:

python实现对求解最长回文子串的动态规划算法

当j>1时,判断f(i,j)是否为回文子串的操作只与j-1时的的操作相关,即f(i,j) = g(f(i, j-1)),其中j>1,i in range(0, j+1),所以接下来就变成求解g()函数了。   

用nlist存储j情况下所有的子串是否为回文子串的标志

用olist存储j-1情况下所有的子串是否为回文子串的标志

那么olist与nlist的关系是什么呢?

python实现对求解最长回文子串的动态规划算法

有上图可知,nlist[i] = g(olist[i+1])

新的算法如下:

k = len(s) 
 olist = [0] * k # 申请长度为n的列表,并初始化 
nList = [0] * k # 同上 
logestSubStr = "" 
 logestLen = 0 
 
  for j in range(0, k): 
   for i in range(0, j + 1): 
    if j - i <= 1: 
     if s[i] == s[j]: 
      nList[i] = 1 # 当 j 时,第 i 个子串为回文子串 
      len_t = j - i + 1 
      if logestLen < len_t: # 判断长度 
       logestSubStr = s[i:j + 1] 
       logestLen = len_t 
    else: 
     if s[i] == s[j] and olist[i+1]: # 当j-i>1时,判断s[i]是否等于s[j],并判断当j-1时,第i+1个子串是否为回文子串 
      nList[i] = 1 # 当 j 时,第 i 个子串为回文子串 
      len_t = j - i + 1 
      if logestLen < len_t: 
       logestSubStr = s[i:j + 1] 
       logestLen = len_t 
   olist = nList  # 覆盖旧的列表 
   nList = [0] * k # 新的列表清空 
  return logestSubStr

 这样新算法的空间复杂度就为O(2n),即O(n)。算法平均耗时3s左右,而且该算法更符合动态规划的原理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python 获取进程pid号的方法
Mar 10 Python
在Python的Django框架中创建语言文件
Jul 27 Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
python实现Windows电脑定时关机
Jun 20 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
Python 如何优雅的将数字转化为时间格式的方法
Sep 26 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
pyqt5 textEdit、lineEdit操作的示例代码
Aug 12 Python
python的链表基础知识点
Sep 13 Python
Python实现老照片修复之上色小技巧
Oct 16 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 #Python
用Python一键搭建Http服务器的方法
Jun 01 #Python
python 编写简单网页服务器的实例
Jun 01 #Python
Django中间件实现拦截器的方法
Jun 01 #Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 #Python
详解Python如何生成词云的方法
Jun 01 #Python
Python实现的个人所得税计算器示例
Jun 01 #Python
You might like
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
php简单实现短网址(短链)还原的方法(测试可用)
2016/05/09 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
Smarty模板语法详解
2019/07/20 PHP
Js中sort()方法的用法
2006/11/04 Javascript
Javascript调试工具(下载)
2007/01/09 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
python去除字符串中的换行符
2017/10/11 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
Python3列表List入门知识附实例
2020/02/09 Python
毕业生求职推荐信
2013/11/04 职场文书
大学学习生活感言
2014/01/18 职场文书
公证委托书标准格式
2014/09/11 职场文书
学校联谊协议书
2014/09/16 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
教师党员批评与自我批评
2014/10/15 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python