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 logging模块学习笔记
May 24 Python
Python求出0~100以内的所有素数
Jan 23 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
pytorch多GPU并行运算的实现
Sep 27 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
Python栈的实现方法示例【列表、单链表】
Feb 22 Python
深入了解Python装饰器的高级用法
Aug 13 Python
python中time tzset()函数实例用法
Feb 18 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/10/09 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
2011/04/23 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
利用js跨页面保存变量做菜单的方法
2008/01/17 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python 日期与时间转换的方法
2020/08/01 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
几道数据库的概念性面试题
2014/05/30 面试题
董事长秘书岗位职责
2013/11/29 职场文书
大学生最常用的自我评价
2013/12/07 职场文书
文明学生事迹材料
2014/01/29 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
2015年全国爱眼日活动小结
2015/02/27 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
基于JavaScript实现省市联动效果
2021/06/22 Javascript
Pygame Draw绘图函数的具体使用
2021/11/17 Python
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏