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调用cmd命令行制作刷博器
Jan 13 Python
使用python编写android截屏脚本双击运行即可
Jul 21 Python
Python类定义和类继承详解
May 08 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
python自动循环定时开关机(非重启)测试
Aug 26 Python
详解使用Python下载文件的几种方法
Oct 13 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
python绘制封闭多边形教程
Feb 18 Python
Python使用正则表达式实现爬虫数据抽取
Aug 17 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 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下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
通达OA公共代码 php常用检测函数
2011/12/14 PHP
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
JS Timing
2007/04/21 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
bootstrap table配置参数例子
2017/01/05 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
python中学习K-Means和图片压缩
2017/11/20 Python
python实现ID3决策树算法
2017/12/20 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
python异常处理try except过程解析
2020/02/03 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
2020/04/14 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
python调用win32接口进行截图的示例
2020/11/11 Python
大专生的学习自我评价
2013/12/04 职场文书
企业消防安全责任书
2014/07/23 职场文书
奖学金感谢信
2015/01/21 职场文书
内勤岗位职责
2015/02/10 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python