算法--最长回文子串--java--python
创始人
2025-05-30 15:20:46

这个算法题里面总是有

暴力解法

把所有字串都拿出来判断一下
这里有小小的优化:

  • 就是当判断的字串小于等于我们自己求得的最长回文子串的长度,那么我们就不需要在进行对这个的判断
  • 这里的begin,还可以用来取得最小回文子串是什么
    java
    // 暴力解法最长回文子串public static int longestPalindrome(String s) {int len = s.length();if (s.length() < 2)return len;int maxLen = 1;int begin = 0;char[] chars = s.toCharArray();for (int i = 0; i < len; i++) {for (int j = i + 1; j < len; j++) {if (validPalindromic(chars, i, j))maxLen = Math.max(maxLen, j - i + 1);begin = i;}}return maxLen;}// 验证子串 s[left..right] 是否为回文串private static boolean validPalindromic(char[] chars, int left, int right) {while (left < right) {if (chars[left] != chars[right]) {return false;}left++;right--;}return true;}

python

def longestPalindrome(s: str) -> int:if len(s) < 2:return len(s)maxLen = 0for i in range(len(s)):for j in range(i+1, len(s)):if maxLen < j - i + 1 and s[i:j] == s[j:i:-1]:maxLen = j-i+1return maxLens = input()
print(longestPalindrome(s))

中心扩散法

以某数或者某2个数为中心进行扩散判断

    // 中心扩散法最长回文子串public static int longestPalindrome2(String s) {int len = s.length();if (s.length() < 2)return len;int maxLen = 1;char[] chars = s.toCharArray();for (int i = 0; i < len; i++) {maxLen = Math.max(maxLen, expandAroundCenter(chars, i, i));maxLen = Math.max(maxLen, expandAroundCenter(chars, i, i + 1));}return maxLen;}private static int expandAroundCenter(char[] charArray, int left, int right) {while (left >= 0 && right < charArray.length && charArray[left] == charArray[right]) {left--;right++;}return right - left -1;}

python

# 中心扩展法
def longestPalindrome(s: str) -> int:if len(s) < 2:return len(s)maxLen = 0for i in range(len(s)):maxLen = max(maxLen, expand(s, i, i))maxLen = max(maxLen, expand(s, i, i+1))return maxLendef expand(s: str, left: int, right: int) -> int:while left >= 0 and right < len(s) and s[left] == s[right]:left -= 1right += 1return right - left - 1s = input()
print(longestPalindrome(s))

manacher算法

这个算法

123456
aabbaa

首先得知道几点:

  • 解决对称中心是数还是数中间。
    我们可以在每一个中间插入一个#,用#来代表2个数的中间,就统一了起来。
123456
#a#a#b#b#a#a#
  • 算法我觉得是在中心扩展的衍生
    先通过中心扩展找到前几个最大的dp,然后通过已经求得的dp优化需要求得的数。
    为了实现这个需要维护几个变量。已经求得的能够到最右边的回文子串的最右数、对称中心。
    • 对称中心左右的在圈内的dp应该是一样的。
    • 如到7的时候可以得到最右为13中心为7.
    • 求dp【10】的时候由于对称其,圈内的dp【10】=dp【4】=1
    • 如果这个dp大于右边界,我们是不能确定的,所以最大只能取右边界。然后在扩展
12345678910111213
#a#a#b#b#a#a$

在求新数的时候,如果这个数在这个最右子串里面,

    // manacher算法最长回文子串public static int longestPalindrome(String s) {if (s.length() < 2)return s.length();// 预处理StringBuilder sb = new StringBuilder();sb.append("@#");for (int i = 0; i < s.length(); i++) {sb.append(s.charAt(i));sb.append('#');}sb.append("#$");char[] chars = sb.toString().toCharArray();int len = chars.length;int[] dp = new int[len];int maxCenter = 0, maxRight = 0, maxLen = 0;for (int i = 1; i < len - 1; i++) {dp[i] = maxRight > i ? Math.min(dp[2 * maxCenter - i], maxRight - i) : 1;while (chars[i + dp[i]] == chars[i - dp[i]])dp[i]++;if (maxRight < i + dp[i]) {maxRight = i + dp[i];maxCenter = i;}maxLen = Math.max(maxLen, dp[i]);}return maxLen - 1;}
# manacher算法
def longestPalindrome(s: str) -> int:if len(s) < 2:return len(s)s = "@#" + '#'.join(s) + "#$"  # 预处理maxLen = 0maxRight = 0maxCenter = 0p = [0] * len(s)for i in range(1,len(s)-1):if i < maxRight:p[i] = min(p[2 * maxCenter - i], maxRight - i)else:p[i] = 1# 不懂为什么这个不加前面的条件就通不过while i-p[i] > 0 and i+p[i] < len(s)-1 and s[i-p[i]] == s[i+p[i]]:p[i] += 1if i + p[i] > maxRight:maxRight = i + p[i]maxCeaanter = imaxLen = max(maxLen, p[i])return maxLen - 1

相关内容

热门资讯

奔腾B70怎么样-车主点评-真... 今天给各位分享奔腾B70怎么样-车主点评-真实评价-口碑的知识,其中也会对奔腾b70这车质量到底怎么...
乐驰1.0油耗真实油耗多少(乐... 本篇文章极速百科给大家谈谈乐驰1.0油耗真实油耗多少,以及乐驰10几个油对应的知识点,希望对各位有所...
女人梦见老虎是什么预兆,女人梦... 女人梦见老虎是什么预兆目录女人梦见老虎是什么预兆女人梦到老虎预示着什么意思梦见老虎是什么意思女人梦见...
出门旅游必带的物品有哪些,旅游... 出门旅游必带的物品有哪些目录出门旅游必带的物品有哪些旅游带些什么必备用品出行旅游应该带些什么?出门旅...
数据分析Numpy之布尔索引 布尔数据:只有两种值,即真(True)或假&...
深入理解JVM虚拟机(二) 目录: (1)堆 (2)堆-内...
【Java SE】变量的本质 目录一. 前言二. 变量(variable)2.1 性质2.2 变量类型2.2.1 核心区别2.3 ...
金属的截止频率(红限)是什么,... 金属的截止频率(红限)是什么目录金属的截止频率(红限)是什么极限频率的介绍什么是金属的截止频率光电效...
曾国藩有那七句最著名的名言,曾... 曾国藩有那七句最著名的名言目录曾国藩有那七句最著名的名言曾国藩说过的名言名句。曾国藩的名言曾国藩名言...
二八佳人打一生肖(二八佳人打一... 今天给各位分享二八佳人打一生肖的知识,其中也会对二八佳人打一生肖是什么进行解释,如果能碰巧解决你现在...
水晶底是什么材质,nike 篮... 水晶底是什么材质目录水晶底是什么材质nike 篮球鞋水晶底氧化吗?水晶是什么材料玻璃杯水晶底和烧厚底...
从0开始学python -67 Python3 pip pip 是 Python 包管理工具,该工具提供了对 Pyth...
接入HMS Core应用内支付... 华为HMS Core应用内支付服务(In-App Purchases,I...
怎么用pscs6的路径选择工具... 怎么用pscs6的路径选择工具目录怎么用pscs6的路径选择工具ps如何选择路径ps如何选择路径区域...
电动车后面总是哒哒响asdad... 本篇文章极速百科给大家谈谈电动车后面总是哒哒响asdad1,以及电动车后面总是哒哒响维修视频对应的知...
新起亚K3的CVT耐用吗?起亚... 今天给各位分享新起亚K3的CVT耐用吗?起亚K3七速双离合到底好不好的知识,其中也会对起亚k314t...
职场kpl是什么意思,kpl在... 职场kpl是什么意思目录职场kpl是什么意思kpl在工作中是什么意思?职场kpl是什么意思职场kpl...
那些我在初级程序员阶段犯过的错 学习鉴别,形成习惯,避免犯错我要先说清楚一件事。如果你是一个初级程序员&...
完全小白的pycharm深度学... 完全小白的pycharm深度学习调试+for循环断点条件设置写在最前面基础方法pycharm...
MongoDB增加计算列并修改... 1. 增加、删除列 通过聚合,使用操作符$set增加列;修改结果...
阿里云PAI-DeepRec ... 阿里云联合英特尔举办的“创新大师杯”全球AI极客挑战赛——PAI-DeepRec CTR模型性能优化...
评价老师上课的评语有哪些,对上... 评价老师上课的评语有哪些目录评价老师上课的评语有哪些对上课教师课堂的评价怎样用专业术语评价任课老师讲...
噬血代码ign评分,噬血代码有... 噬血代码ign评分目录噬血代码ign评分噬血代码有缺陷是什么意思IGN评分是什么意思噬血代码能力值怎...
java并发 AQS 什么是AQS? 为什么它是核心?AQS的核心思想是什么? 它是怎么实现的? 底层数据结构等AQS有哪...
长喙的意思长喙解释(长喙的意思... 今天给各位分享长喙的意思长喙解释的知识,其中也会对长喙的意思和拼音进行解释,如果能碰巧解决你现在面临...
广西壮族自治区出租汽车司机崔腿... 今天给各位分享广西壮族自治区出租汽车司机崔腿粗师傅在四十四棵死涩...的知识,其中也会对广西壮族自治...
开发中常用多线程异步操作场景解... 场景一:批量操作,事务控制部分回滚 第一步:创建现场池,注意不同业务场景...
信息系统项目管理师 第2章 信... 1.信息技术及其发展 可分为硬技术(物化技术)传感器、服务器、智能手机、通信卫星和软技术(非物化技术...
【C++】一篇带你搞懂C++“... 前言在C语言的学习中,并没有引用这个概念,但是在C++中...
烧鸡怎么盘,烧鸡的腿怎么塞肚子... 烧鸡怎么盘目录烧鸡怎么盘烧鸡的腿怎么塞肚子里关记烧鸡的做法是什么?大盘烧鸡怎么做烧鸡怎么盘 烧...