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函数的笔记整理
Apr 07 Python
python获得一个月有多少天的方法
Jun 04 Python
Python获取系统默认字符编码的方法
Jun 04 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
python numpy实现文件存取的示例代码
May 26 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python 读取WAV音频文件 画频谱的实例
Mar 14 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
python suds访问webservice服务实现
Jun 26 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
多文件上传的例子
2006/10/09 PHP
在PWS上安装PHP4.0正式版
2006/10/09 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
基于JavaScript 声明全局变量的三种方式详解
2013/05/07 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
jQuery添加和删除输入文本框标签代码
2016/05/20 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
JavaScript变量作用域_动力节点Java学院整理
2017/06/27 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
python用来获得图片exif信息的库实例分析
2015/03/16 Python
在Python中使用Neo4j的方法
2019/03/14 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
html5 canvas 使用示例
2010/10/22 HTML / CSS
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
旅游管理专业学生求职信
2013/09/28 职场文书
公司请假条范文
2014/04/11 职场文书
给学校的建议书范文
2014/05/15 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
开场白怎么写
2015/06/01 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书