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实现发送email的几种常用方法
Aug 18 Python
Python中用max()方法求最大值的介绍
May 15 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
python实现批量视频分帧、保存视频帧
May 31 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
使用Python将Exception异常错误堆栈信息写入日志文件
Apr 08 Python
python 将列表里的字典元素合并为一个字典实例
Sep 01 Python
python基础入门之字典和集合
Jun 13 Python
python游戏开发Pygame框架
Apr 22 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 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+mysql事务rollback&amp;commit示例
2010/02/08 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
插件:检测javascript的内存泄漏
2007/03/04 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
JavaScript Tab菜单实现过程解析
2020/05/13 Javascript
推荐下python/ironpython:从入门到精通
2007/10/02 Python
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
设置python3为默认python的方法
2018/10/31 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
python实现两张图片的像素融合
2019/02/23 Python
pytorch打印网络结构的实例
2019/08/19 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
成品仓管员工作职责
2013/12/29 职场文书
课程改革实施方案
2014/03/16 职场文书
年终考核实施方案
2014/05/26 职场文书
红色故事汇观后感
2015/06/18 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js