题目描述

给定一个字符串s,找到 s中最长的回文子串。你可以假设s的最大长度为 1000

LeetCode原题地址:https://leetcode-cn.com/problems/longest-palindromic-substring/

测试用例

  • 示例 1

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

  • 示例 2

输入: “cbbd”
输出: “bb”

解题代码和思路

  • 遍历所有子串寻找回文子串
class Solution(object):def validate_palindrome(self,s,left,right):"""判断字符串是否为回文字符串:param s::param left::param right::return:"""if len(s) < right and left < 0:assert("s length must greater than right,left must greater than or equal to zero")while left < right:#回文字符串左边和右边字符相等if s[left] != s[right]:return False#移动左边和右边的指针left += 1right -= 1return Truedef longestPalindrome(self,s):s_len = len(s)if s_len < 2:return s#用来记录回文字符串palindrome_s = s[0]#记录回文字符串长度max_len = 1#遍历字符串中的所有子串for i in range(s_len-1):for j in range(i+1,s_len):if j-i+1 > max_len and self.validate_palindrome(s,i,j):palindrome_s = s[i:j+1]max_len = j - i + 1return palindrome_s
  • 动态规划
class Solution(object):def longestPalindrome(self,s):size = len(s)#如果字符串的长度为1就是回文字符串if size < 2:return s#创建一个二维列表用来保存每个字符串是否为回文字符串is_p = [[False for _ in range(size)] for _ in range(size)]#对角线上都是回文字符串,因为都是单个字符for i in range(size):is_p[i][i] = True#用来记录回文字符串的起始位置s_index = 0max_len = 1#遍历表格,计算字符串是否为回文字符串for j in range(1,size):for i in range(0,j):if s[i] == s[j]:if j - i < 3:is_p[i][j] = Trueelse:is_p[i][j] = is_p[i+1][j-1]else:is_p[i][j] = False#记录最长的回文字符串current_len = j - i + 1if is_p[i][j] and current_len > max_len:max_len = current_lens_index = ireturn s[s_index:(s_index+max_len)]
  • 中心扩散算法
class Solution(object):def center_spread(self,s,size,left,right):"""中心扩散寻找回文字符串:param s: 字符串:param size: 字符串的长度:param left: 开始寻找左边的位置:param right: 开始寻找右边的位置:return: 回文字符串,回文字符串的长度"""i = leftj = right#保证在寻找的过程中不发生越界,而且左右两个字符要相等while i >= 0 and j < size and s[i] == s[j]:i -= 1j += 1return s[i+1:j],j-i-1def longestPalindrome(self,s):size = len(s)if size < 2:return ss_palindrome = s[0]max_len = 0for i in range(size):#当回文字符串是奇数的时候odd_palindrome,odd_len = self.center_spread(s,size,i,i)#当回文字符串是偶数的时候even_palindrom,even_len = self.center_spread(s,size,i,i+1)#获取最长的回文字符串cur_palindrome = odd_palindrome if odd_len > even_len else even_palindrom#更新最长的回文字符串if len(cur_palindrome) > max_len:s_palindrome = cur_palindromemax_len = len(cur_palindrome)return s_palindrome
  • Manacher(拉马车) 算法
class Solution(object):def longestPalindrome(self,s):size = len(s)if size < 2:return s#对原始字符串的每个间隙添加一个字符串#expand_s = "#"for i in range(size):expand_s += s[i]expand_s += "#"#计算扩展之后的字符长度expand_s_size = size * 2 + 1#初始化P数组p = [0 for _ in range(expand_s_size)]#定义中心指针和右边界指针center = 0max_right = 0#记录最长回文字符串的起始位置start = 1#记录回文字符串的长度max_len = 1for i in range(expand_s_size):#利用回文字符的镜像特点,来减少重复的计算if i < max_right:mirror = 2 * center - i#利用镜像计算回文字符串的长度不能超过右边界p[i] = min(max_right-i,p[mirror])#定义左右两个指针,利用中心扩散算法寻找边界外的回文字符串left = i - (1 + p[i])right = i + (1 + p[i])while left < right and left >= 0 and right < expand_s_size and expand_s[left] == expand_s[right]:p[i] += 1left -= 1right += 1#更新最长的右边界和中心位置,尽量减少计算if p[i] > max_right:max_right = i + p[i]center = i#计算最长回文字符串if p[i] > max_len:max_len = p[i]start = (i - max_len) // 2return s[start:(start+max_len)]

参考:

  1. LeetCode详细题解
  2. 拉马车算法详解

python实现寻找最长回文子串相关推荐

  1. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...

    前言 最近准备把算法慢慢的捡起来,所以准备日更一道算法题目,难度自然是由简入难,所以同学们可以每天都来看看小编的更新. 日更时间定在每晚20:00,希望大家多多关注啦. 昨天就欠更了,简直就是打脸.过 ...

  2. python求回文_python实现求最长回文子串长度

    给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...

  3. python 面试题 aac caa相似_经典面试题:最长回文子串

    回文串是面试常常遇到的问题(虽然问题本身没啥意义),本文就告诉你回文串问题的核心思想是什么. 首先,明确一下什:回文串就是正着读和反着读都一样的字符串. 比如说字符串aba和abba都是回文串,因为它 ...

  4. python【力扣LeetCode算法题库】5- 最长回文子串

    5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...

  5. LeetCode5-最长回文子串原理及Python实现

    LeetCode5(medium)-最长回文子串 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 思路 中心扩展法 遍历字符串,依次把每个字符作为中心. ...

  6. 最大子串和 python_5. 最长回文子串(Python)

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 示例 1: 输入: "babad" 输出: "bab" 注 ...

  7. LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)

    Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法:直接循环求解,o(n2)o(n^2) class Solution:de ...

  8. Python最长回文子串

    1.暴力解法(Brute Method)        暴力求解是最容易想到的,要截取字符串的所有子串,然后再判断这些子串中哪些是回文的,最后返回回文子串中最长的即可. 这里我们可以使用两个变量,一个 ...

  9. python生成回文字符串_回文字符串最长回文子串和子序列 - Python

    Palindrome 回文字符串就是指从前往后和从后往前读,都是一样的,比如"aabcbaa". 注意区分子串和子序列,子串是连续的,子序列可以不连续 题型1:判断字符串是否为回文 ...

最新文章

  1. oracle启动服务和监听命令
  2. 20145202 《信息安全系统设计基础》第8周学习总结
  3. Oracle编程入门经典 第11章 过程、函数和程序包
  4. Type EnumTypeInfo<xxxxx> cannot be used as key. Contained UNSUPPORTED key types: EnumTypeInfo<xxxxx>
  5. k8s pod内部容器_第三章 pod:运行于kubernetes中的容器
  6. netcore之判断系统
  7. 2000/XP系统蓝屏原因与解决
  8. Pillow 10行代码给营业执照模板写数据,批量生产
  9. 【渝粤题库】陕西师范大学201821 宋词研究 作业(专升本)
  10. python中cls和self的区别
  11. 银行业务--负债业务
  12. Web在线聊天室(6) --- login登录接口
  13. Slam14讲——直接法
  14. caffe与cv2图片格式的相互转换
  15. 关于 CentOS系统编译Qt项目报错:error: cannot find -lGL 的解决方法
  16. 有效的字母异位词python(leetcode242)
  17. 计算机组成原理 ---期末复习(珍藏版)
  18. 火炬电阻_火炬神经网络的对抗性攻击和防御
  19. 冠捷拟收购飞利浦电视业务 双方已签订意向书
  20. Adobe软件安装报错195

热门文章

  1. MacBook Pro M1 Parallels Desktop Ubuntu 共享网络设置静态 IP
  2. 结构光N步相移+多频外差法之解相位:三频四相
  3. zookeeper-系列2,简单实用
  4. C语言实现模拟键盘输入字符串
  5. VMware虚拟机安装kali linux 系统时黑屏,左上角光标一直闪
  6. C++ 大整数运算 高精度除法
  7. CnOpenData公共数据专区上新 | 中文金融情感词典
  8. 一个有趣的TimesTen大数据案例-美国邮政
  9. 清华大学计算机科学王昊,日照最好的三所高中,新鲜出炉!
  10. Win11右下角图标折叠不见了怎么办?