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 ZipFile模块详解
Nov 01 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Tensorflow之Saver的用法详解
Apr 23 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
对django2.0 关联表的必填on_delete参数的含义解析
Aug 09 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
详解如何在PyCharm控制台中输出彩色文字和背景
Aug 17 Python
python 实现客户端与服务端的通信
Dec 23 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
微信API接口大全
2015/04/15 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
PHP使用内置函数生成图片的方法详解
2016/05/09 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
JavaScript中数组常见操作技巧
2017/09/01 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
[39:18]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第二场 12.17
2020/12/19 DOTA
python定时执行指定函数的方法
2015/05/27 Python
星球大战与Python之间的那些事
2016/01/07 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
python实现决策树
2017/12/21 Python
Python matplotlib绘图可视化知识点整理(小结)
2018/03/16 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
20行python代码实现人脸识别
2019/05/05 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
python+opencv实现车牌定位功能(实例代码)
2019/12/24 Python
python实现数字炸弹游戏
2020/07/17 Python
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
建设单位项目负责人任命书
2014/06/06 职场文书
酒店厨房管理制度
2015/08/06 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL