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实现猜数字游戏(无重复数字)示例分享
Mar 29 Python
Ruby元编程基础学习笔记整理
Jul 02 Python
深入理解python中的atexit模块
Mar 07 Python
Python实现采用进度条实时显示处理进度的方法
Dec 19 Python
python装饰器深入学习
Apr 06 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
python多线程并发让两个LED同时亮的方法
Feb 18 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
Pandas搭配lambda组合使用详解
Jan 22 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
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
微信小程序 wxapp导航 navigator详解
2016/10/31 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
python中关于日期时间处理的问答集锦
2013/03/08 Python
python实现哈希表
2014/02/07 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
python中pip的安装与使用教程
2018/08/10 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
Win11查看设备管理器
2022/04/19 数码科技