[LeetCode] 5. Longest Palindromic Substring ☆☆☆☆
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
求字符串中的最大回文子串(从左往右和从右往左读一样的子串)。
Example:
Input: "babad" Output: "bab" Note: "aba" is also a valid answer.
Example:
Input: "cbbd" Output: "bb"
解法1:
遍历每个字符,以该字符为中心,往两边扩散寻找回文子串。应注意奇偶情况,比如"bob"是奇数形式的回文,"noon"就是偶数形式的回文,两种形式的回文都要搜索。该算法时间复杂度为O(n2)。
public class Solution {
public String longestPalindrome(String s) {
int maxBegin = 0; // 最大回文子串的起始点
int maxLength = 0; // 最大回文子串的长度
int currLength = 0; // 以当前字符为中心的回文子串长度
for (int i = 0; i < s.length() - 1; i++) {
// 以当前字符为中心寻找回文子串
currLength = searchPalindrome(s, i, i);
if (currLength > maxLength) {
maxLength = currLength;
maxBegin = i - (currLength >> 1);
}
// 如果当前字符和下一个字符相同,还应寻找以这两个字符为中心的回文子串
if (s.charAt(i) == s.charAt(i + 1)) {
currLength = searchPalindrome(s, i, i + 1);
if (currLength > maxLength) {
maxLength = currLength;
maxBegin = i + 1 - (currLength >> 1);
}
}
}
if (maxLength == 0) maxLength = s.length();
return s.substring(maxBegin, maxBegin + maxLength);
}
public int searchPalindrome(String s, int left, int right) {
int step = 1;
while ((left - step >= 0) && (right + step < s.length())) {
if (s.charAt(left - step) != s.charAt(right + step))
break;
step++;
}
return right - left + (step << 1) - 1;
}
}
解法2:
此题还可以用动态规划Dynamic Programming来解,我们维护一个二维数组dp,其中dp[i][j]表示字符串区间[i, j]是否为回文串,当i = j时,只有一个字符,肯定是回文串,如果i = j + 1,说明是相邻字符,此时需要判断s[i]是否等于s[j],如果i和j不相邻,即i - j >= 2时,除了判断s[i]和s[j]相等之外,dp[j + 1][i - 1]若为真,就是回文串,通过以上分析,可以写出递推式如下:
dp[i, j] = 1 if i == j
= s[i] == s[j] if j = i + 1
= s[i] == s[j] && dp[i + 1][j - 1] if j > i + 1
判断顺序:s[0][0] —> s[0][1] —> s[1][1] —> s[0][2] —> s[1][2] —> s[2][2] —> s[0][3] —> ....
public class Solution {
public String longestPalindrome(String s) {
boolean[][] isPal = new boolean[s.length()][s.length()];
int left = 0;
int right = 0;
for (int j = 0; j < s.length(); j++) {
for (int i = 0; i < j; i++) {
isPal[i][j] = (s.charAt(i) == s.charAt(j)) && (j - i < 2 || isPal[i + 1][j - 1]);
if (isPal[i][j] && (j - i > right - left)) {
left = i;
right = j;
}
}
isPal[j][j] = true;
}
return s.substring(left, right + 1);
}
}
解法3:
最后要来的就是大名鼎鼎的马拉车算法Manacher's Algorithm,这个算法的神奇之处在于将时间复杂度提升到了O(n)这种逆天的地步,而算法本身也设计的很巧妙,很值得掌握,具体算法参见:Manacher算法总结 和 Manacher's Algorithm 马拉车算法。
public class Solution {
public String longestPalindrome(String s) {
// 字符串穿插"#",同时加头加尾防止越界
StringBuilder sb = new StringBuilder("@#");
for (int i = 0; i < s.length(); i++) {
sb.append(s.charAt(i)).append("#");
}
sb.append("$");
int[] len = new int[sb.length()];
int maxCenter = 0; // 记录最大回文子串的中心位置
int maxLength = 0; // 记录最大回文子串的半径
int id = 0; // 记录当前计算过的右边界所属的回文子串中心
int mx = 0; // 记录当前计算过的右边界
for (int i = 1; i < sb.length() - 1; i++) {
len[i] = i < mx ? Math.min(len[2 * id - i], mx - i + 1) : 1;
while (sb.charAt(i - len[i]) == sb.charAt(i + len[i]))
len[i]++;
if (mx < i + len[i] - 1) {
mx = i + len[i] - 1;
id = i;
}
if (maxLength < len[i]) {
maxLength = len[i];
maxCenter = i;
}
}
return s.substring((maxCenter - maxLength) / 2, (maxCenter - maxLength) / 2 + maxLength - 1);
}
}
[LeetCode] 5. Longest Palindromic Substring ☆☆☆☆的更多相关文章
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
- LeetCode 5 Longest Palindromic Substring(最长子序列)
题目来源:https://leetcode.com/problems/longest-palindromic-substring/ Given a string S, find the longest ...
- 【JAVA、C++】LeetCode 005 Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...
- [LeetCode][Python]Longest Palindromic Substring
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...
- 【LeetCode】Longest Palindromic Substring 解题报告
DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...
- [LeetCode] 5. Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
随机推荐
- 由一个hash字符串生成多个子hash字符串
通过存储一个head hash,然后把子hash放到网络中 当然,也可以像默克尔树那样的,生成多级的子hash ,可以通过规则配置不同的hash 生成方式.倒置的默克尔树 我有一个文件,然后我把她分隔 ...
- vmware安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
虚拟机使用的是VMware Workstation,并且首次在虚拟机体验64 位系统.在新建好虚拟机,运行时候就出现了VMware Workstation 的提醒:此主机支持 Intel VT-x,但 ...
- 微信小程序学习:开发注意点
11月2日更新: 微信小程序支持内嵌网页,新增 <web-view /> 组件调试支持: 传送门 <!-- wxml --> <!-- 指向微信公众平台首页的web-vi ...
- Python—元组(戴上了枷锁的列表)
一.概念 元组属于不可变序列,元组是包含多个元素的类型,元素之间用逗号分割.例如:t1=123,456,“hello”元组可以是空的,t2=()元组包含一个元素时:t3=123,元组外侧可以使用括号, ...
- 内存转储文件调试系统崩溃bug
百度百科:内存转储文件 内存转储是用于系统崩溃时,将内存中的数据转储保存在转储文件中,供给有关人员进行排错分析用途.而它所保存生成的文件就叫做内存转储文件. 内存转储文件也被称作虚拟内存,它是用硬盘里 ...
- winform Form窗体和UserControl用户空间嵌入Panel容器并填充
private void sbtbflList_Click(object sender, EventArgs e) { ucxmflList ucfl = new ucxmflList();//用户控 ...
- zookeeper伪集群安装
记录下zookeeper伪分布式搭建的过程,假设系统已经配置好了JAVA环境. 1.准备环境 linux服务器一台,下载某个版本的zookeeper压缩包,下载链接:http://apache.cla ...
- xpath教程二 ---- 通过ID和Class检索
必备知识点 在html中,id是唯一的 在html中,class是可以多处引用的 工具 Python3版本 lxml库[优点是解析快] HTML代码块[从网络中获取或者自己杜撰一个] requests ...
- 升级到EFCore2.0
EF Core 2.0上周已经发布了 文章内容基于vs2017,请大家先安装好vs2017(15.3). 本篇文章主要讲下差异点,跟之前一样的就不再重复了. 文章目录(差异点): 一.新建项目, EF ...
- BZOJ 1875 HH去散步(矩阵快速幂)
题意: 给定一张无向图,每条路的长度都是1,没有自环,可能有重边,给定起点与终点,求从起点走t步到达终点的方案数. 每一步走的时候要求不能走上一条刚刚走的路. 解析: 显然需要搞出个矩阵之后矩乘. 然 ...