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分割TXT文件成4K的TXT文件
May 23 Python
Python Trie树实现字典排序
Mar 28 Python
Python实现3行代码解简单的一元一次方程
Aug 18 Python
Python 26进制计算实现方法
May 28 Python
Python生成随机密码的方法
Jun 16 Python
利用aardio给python编写图形界面
Aug 21 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
Mar 19 Python
java中两个byte数组实现合并的示例
May 09 Python
Python unittest模块用法实例分析
May 25 Python
用sqlalchemy构建Django连接池的实例
Aug 29 Python
python自动化实现登录获取图片验证码功能
Nov 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
PHP循环获取GET和POST值的代码
2008/04/09 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
pygame游戏之旅 游戏中添加显示文字
2018/11/20 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
武汉东之林科技有限公司机试
2013/09/17 面试题
体育学院毕业生自荐信
2013/11/03 职场文书
文艺晚会策划方案
2014/06/11 职场文书
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
办公楼租房协议书范本
2014/11/25 职场文书
创业计划书之酒店
2019/08/30 职场文书
python基础之文件操作
2021/10/24 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript