回文字符串—回文子串—中心扩散法
leetcode地址:5. 最长回文子串
解答参考:动态规划、中心扩散、Manacher 算法
问题描述:
给你一个字符串 s
,找到 s
中最长的回文子串。比如给定字符串s = "babad" ,找出最长的回文子串为"bab"
算法思路:
本题可以采用暴力破解法、中心扩散法、Manacher算法3种方法,本篇文章讲解暴力破解法。
暴力法采用双指针两边夹,验证是否是回文子串。除了枚举字符串的左右边界以外,比较容易想到的是枚举可能出现的回文子串的“中心位置”,从“中心位置”尝试尽可能扩散出去,得到一个回文串。因此中心扩散法的思路是:遍历每一个索引,以这个索引为中心,利用“回文串”中心对称的特点,往两边扩散,看最多能扩散多远。枚举“中心位置”时间复杂度为 O(N),从“中心位置”扩散得到“回文子串”的时间复杂度为 O(N),因此时间复杂度可以降到 O(N^2)。在这里要注意一个细节:回文串在长度为奇数和偶数的时候,“回文中心”的形式是不一样的。
- 奇数回文串的“中心”是一个具体的字符,例如:回文串 "aba" 的中心是字符 "b";
- 偶数回文串的“中心”是位于中间的两个字符的“空隙”,例如:回文串串 "abba" 的中心是两个 "b" 中间的那个“空隙”。
我们看一下一个字符串可能的回文子串的中心在哪里?我们可以设计一个方法,兼容以上两种情况:
- 如果传入重合的索引编码,进行中心扩散,此时得到的回文子串的长度是奇数;
- 如果传入相邻的索引编码,进行中心扩散,此时得到的回文子串的长度是偶数。
具体编码细节在以下的代码的注释中体现。
public class Solution {public String longestPalindrome(String s) {int len = s.length();if (len < 2) {return s;}int maxLen = 1;String res = s.substring(0, 1);// 中心位置枚举到 len - 2 即可for (int i = 0; i < len - 1; i++) {String oddStr = centerSpread(s, i, i);String evenStr = centerSpread(s, i, i + 1);String maxLenStr = oddStr.length() > evenStr.length() ? oddStr : evenStr;if (maxLenStr.length() > maxLen) {maxLen = maxLenStr.length();res = maxLenStr;}}return res;}private String centerSpread(String s, int left, int right) {// left = right 的时候,此时回文中心是一个字符,回文串的长度是奇数// right = left + 1 的时候,此时回文中心是一个空隙,回文串的长度是偶数int len = s.length();int i = left;int j = right;while (i >= 0 && j < len) {if (s.charAt(i) == s.charAt(j)) {i--;j++;} else {break;}}// 这里要小心,跳出 while 循环时,恰好满足 s.charAt(i) != s.charAt(j),因此不能取 i,不能取 jreturn s.substring(i + 1, j);}
}
回文字符串—回文子串—中心扩散法相关推荐
- 回文字符串—回文子串—Manacher算法
leetcode地址:5. 最长回文子串 解答参考:动态规划.中心扩散.Manacher 算法 问题描述: 给你一个字符串 s,找到 s 中最长的回文子串.比如给定字符串s = "babad ...
- 回文字符串—回文子串—暴力破解法
leetcode地址:5. 最长回文子串 解答参考:动态规划.中心扩散.Manacher 算法 问题描述: 给你一个字符串 s,找到 s 中最长的回文子串.比如给定字符串s = "babad ...
- C语言判断字符串是否为回文字符串
判断一字符串是否是回文字符串 回文的意思即为该字符串从左往右读出来的值与从右往左读出来的值一样. 代码 #include <stdio.h> #include <stdlib.h&g ...
- 最长回文串之中心扩散法
最长回文串之中心扩散法 题目描述 leetcode5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1:输入: "babad& ...
- 统计5个字符串回文个数c语言,第一章 字符串 – 1.5 最长回文子串 - 编程之法:面试和算法心得...
最长回文子串 题目描述 给定一个字符串,求它的最长回文子串的长度. 分析与解法 最容易想到的办法是枚举所有的子串,分别判断其是否为回文.这个思路初看起来是正确的,但却做了很多无用功,如果一个长的子串包 ...
- 【LeetCode成长之路:回文字符串运用题】 回文子串与最长回文子串
⭐️前面的话⭐️ 本篇文章介绍有关回文字符串两道题题解,分别为[647. 回文子串 ]和[ 5. 最长回文子串], 难度均为: 中等 标签: 双指针中心扩散 动态规划,展示语言java.
- leetcode 5-最长回文子串(中心扩展算法)
题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 示例1 输入: "babad" 输出: "bab" ...
- python生成回文字符串_回文字符串最长回文子串和子序列 - Python
Palindrome 回文字符串就是指从前往后和从后往前读,都是一样的,比如"aabcbaa". 注意区分子串和子序列,子串是连续的,子序列可以不连续 题型1:判断字符串是否为回文 ...
- leetCode第五题-求字符串最长回文字符串
原题链接: 最长回文字符串 给你一个字符串 s,找到 s 中最长的回文子串. 示例 1: 输入:s = "babad" 输出:"bab" 解释:"ab ...
最新文章
- 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境...
- ios开发入门篇(四):UIWebView结合UISearchBar的简单用法
- magisk下载里显示没有模块_重大更新 | 仓耳云黑大字库amp;模块版本更新!
- JetBrains 加入 .NET 基金会
- Python入门(一) 异常处理
- commons-lang(一)
- 电子邮件一般不在用户计算机中,[单选] 在一个完整的Internet电子邮件地址中,决定用户信箱所在的计算机地址的是()。...
- Learning to Track at 100 FPS with Deep Regression Networks 论文笔记
- ToStringBuilder
- linux编译webengine,am3352请问如何在linux3.8上移植带有webengine的qt5?
- 基于opencv python 的网线线序识别(三)
- 《AWR Adaptive Weighting Regression for 3D Hand Pose Estimation》研读与实践
- Java编程语言的风格
- launch尺寸 包含iPhone X
- “快充”拯救续航,雅迪难称王
- cNc数控Z轴服务器在什么位置,五轴数控机床A、C旋转轴分别安装在哪里?
- Cordova 卸载
- 链表--逆时针旋转一个链表
- vs2019 编译生成dll,lib,并做调用
- Oracle 查询临时表空间
热门文章
- 高创新出GoTVbox多路电视解调器
- @SuppressWarnings 详解
- 基于ARM A53开发板,使用按键中断及中断底半部实现《led灯状态取反》的驱动
- 利用DOM进行照片的切换
- java 高效批量插入 sqlserver 数据库
- keytool命令总结
- 转:V.I. Arnold 论数学教育
- java B2B2C源码电子商务平台 -SpringCloud配置中心高可用搭建
- ACM北大暑期课培训第六天
- WPF 问题 PresentationCore.dll!System.Windows.Media.Composition.DUCE.Channel.SyncFlush() 分析