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查询mysql中文乱码问题
Nov 09 Python
python实现中文分词FMM算法实例
Jul 10 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
实例讲解Python编程中@property装饰器的用法
Jun 20 Python
Django视图之ORM数据库查询操作API的实例
Oct 27 Python
Python通用循环的构造方法实例分析
Dec 19 Python
python多线程并发实例及其优化
Jun 27 Python
Python 使用type来定义类的实现
Nov 19 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
Feb 28 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
Feb 29 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
Python基于Serializer实现字段验证及序列化
Nov 04 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
模仿OSO的论坛(五)
2006/10/09 PHP
php中{}大括号是什么意思
2013/12/01 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
微信小程序scroll-view实现横向滚动和上拉加载示例
2017/03/06 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
微信小程序 页面跳转传值实现代码
2017/07/27 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
利用Python如何生成hash值示例详解
2017/12/20 Python
python之信息加密题目详解
2019/06/26 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
Python 实现数组相减示例
2019/12/27 Python
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
职工的安全责任书范文!
2019/07/02 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python