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 相关文章推荐
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
Python中字典映射类型的学习教程
Aug 20 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
Django框架模板的使用方法示例
May 25 Python
PyCharm2018 安装及破解方法实现步骤
Sep 09 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
Python 实现简单的客户端认证
Jul 29 Python
python中函数返回多个结果的实例方法
Dec 16 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
Django开发RESTful API实现增删改查(入门级)
May 10 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
PHP学习 运算符与运算符优先级
2008/06/15 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
javascript工具库代码
2012/03/29 Javascript
JS数组array元素的添加和删除方法代码实例
2015/06/01 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
3种方式实现瀑布流布局小结
2019/09/05 HTML / CSS
运动会通讯稿400字
2014/01/28 职场文书
模特大赛策划方案
2014/05/28 职场文书
运动会宣传口号
2014/06/09 职场文书
英语邀请函范文
2015/02/02 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js