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的@property装饰器的用法
Apr 28 Python
使用python 和 lint 删除项目无用资源的方法
Dec 20 Python
python 文件查找及内容匹配方法
Oct 25 Python
详解python中list的使用
Mar 15 Python
python实现超市管理系统(后台管理)
Oct 25 Python
python分布式编程实现过程解析
Nov 08 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
Oct 20 Python
Python图片处理之图片裁剪教程
May 27 Python
Python实现查询剪贴板自动匹配信息的思路详解
Jul 09 Python
python神经网络ResNet50模型
May 06 Python
Python中的 enumerate和zip详情
May 30 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 字符串操作入门教程
2006/12/06 PHP
php5.2.0内存管理改进
2007/01/22 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
理解python中生成器用法
2017/12/20 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
使用pandas的box_plot去除异常值
2019/12/10 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
酒吧员工的岗位职责
2013/11/26 职场文书
六年级小学生评语
2014/12/26 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
社会主义核心价值观主题教育活动总结
2015/05/07 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript