• 题目描述

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

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

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"
  • 思路分析

对于回文串,大家一定都不陌生啦,即正读,反读都一样的字符串。

求解最长回文子串问题,必须是马大神的Manacher's Algorithm,时间复杂度O(n),线性搞定,完虐中心扩展和动态规划这些思路

Manacher's Algorithm思路如下:

  1. 对给定字符串进行预处理:
    ①字符两两之间和字符串头尾都插入任一特殊字符,确保处理后的字符串长度一定为奇数,不必再分情况列出奇偶两种情况。eg:abba (4)—>$a$b$b$a$(9)         cde(3)—>$c$d$e$(7)
    ②在处理后的字符串前后各加一个相异的特殊字符,防止字符越界问题
  2. 开一个数组c来存储以B中的第n个元素为中心的最大回文子串,即B[n]为中心的最大回文子串(为了方便起见,原始字符串称A,处理后的字符串称B,新数组称为c)
    eg:B $ a $ b $ b $ a $
         c  0 1 0 1 4 1 0 1 0
    从eg中,我们可以发现c[n] 即以A[n]为中心的最长回文子串长度
    所以找到回文子串的最大长度等价于:找到最大的c[n]
  3. 增加两个帮手,pos来表示最大回文子串的中心,max(=pos+c[pos])表示最大回文子串的半径。
  4. 下面进入大餐,充分利用回文串 内回文 的对称性,这里我怕说不好,贴一下大神的助攻下
    https://blog.crimx.com/2017/07/06/manachers-algorithm/
    https://articles.leetcode.com/longest-palindromic-substring-part-ii/
  • 源码附录
class Solution {
public String longestPalindrome(String s) {
if(s.length()<=1){
return s;
} StringBuilder sb = new StringBuilder();
sb.append("#"); for(int i=0;i<s.length();i++){
sb.append("$");
sb.append(s.charAt(i));
}
sb.append("$*"); int pos = 0;
int r = 0;
int mi = 0;
int ms = 0;
int[] t = new int[sb.length()]; for(int i=1;i<sb.length();i++){
int mirrorCur = 2*pos-i;
t[i] = (i>r) ? 1:(Math.min(t[mirrorCur],r-i));
while((i+t[i])<sb.length() && (sb.charAt(i+t[i]) == sb.charAt(i-t[i]))){
t[i] ++;
} if(i+t[i] > r){
r = t[i] + i;
pos = i;
}
if(t[i]>ms){
ms = t[i];
mi = i;
}
}
return s.substring((mi-ms)/2,(mi+ms)/2-1);
}
}

自行理解,实在不理解的话,参照下文详解版

class Solution {
public String longestPalindrome(String s) {
if(s.length()<=1){
return s;
} StringBuilder sb = new StringBuilder();//进行预处理
sb.append("#"); for(int i=0;i<s.length();i++){
sb.append("$");
sb.append(s.charAt(i));
}
sb.append("$*"); int pos = 0;//当前情况下能够到达的最远的回文子串中心
int r = 0;//当前情况下能到达的最远回文子串半径
int mi = 0;//记录最长的回文子串中心
int ms = 0;//记录最长的回文子串半径
int[] t = new int[sb.length()]; for(int i=1;i<sb.length();i++){
int mirrorCur = 2*pos-i;//记录当前下标和pos的对称点
/*
if(i<r){//当前下标小于当前能够到达的最远回文子串的半径时,用下标的t值
t[i] = Math.min(t[mirrorCur],r-i)
}
else{//负责置1等待
t[i] = 1;
}
*/
t[i] = (i>r) ? 1:(Math.min(t[mirrorCur],r-i)); //检查并更新以当前下标为中心的回文子串到达的最远长度
while((i+t[i])<sb.length() && (sb.charAt(i+t[i]) == sb.charAt(i-t[i]))){
t[i] ++;
} if(i+t[i] > r){ //检查并更新当前能够到达的最远的回文子串的信息
r = t[i] + i;
pos = i;
} if(t[i]>ms){ //更新当前已知的最长的回文串子信息
ms = t[i];
mi = i;
}
}
return s.substring((mi-ms)/2,(mi+ms)/2-1);//去掉辅助符号 进行输出
}
}

Longest Palindromic Substring-----LeetCode进阶路⑤的更多相关文章

  1. Longest Palindromic Substring——LeetCode

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  2. Longest Palindromic Substring -LeetCode

    题目 Given a string s,find the longest palindromic substring in S.You may assume  that the maximum len ...

  3. Longest Palindromic Substring leetcode java

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  4. [LeetCode] Longest Palindromic Substring 最长回文串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  5. Leetcode Longest Palindromic Substring

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  6. 求最长回文子串 - leetcode 5. Longest Palindromic Substring

    写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...

  7. LeetCode 5 Longest Palindromic Substring(最长子序列)

    题目来源:https://leetcode.com/problems/longest-palindromic-substring/ Given a string S, find the longest ...

  8. 【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 ...

  9. [LeetCode] Longest Palindromic Substring(manacher algorithm)

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  10. leetcode:Longest Palindromic Substring(求最大的回文字符串)

    Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...

随机推荐

  1. 奥特曼框架autMan对接微信(千寻、西瓜)框架的详细教程

    教程只写常用的两:西瓜.千寻,都运行在windows平台上. 1.千寻对接 文章底部下载千寻微信框架 解压至win电脑 电脑安装微信3.6.0.18并关闭自动更新 运行千寻微信框架 5.千寻框架设置 ...

  2. Data Warehouse - [00] 参考文献

    浪尖大数据:什么是数据仓库的架构?企业数据仓库架构如何建设? 浪尖大数据:元数据管理在数据仓库的实践应用 - 要养成终生学习的习惯 -

  3. Kafka - 分布式消息队列

    Kafka简介 Kafka原理 Kafka使用 Kafka简介 概念 基于发布/订阅的分布式消息系统 由Linkedin开发,用Scala语言编写 特性 消息持久化:采用时间复杂度O(1)的磁盘存储结 ...

  4. .NET 10 首个预览版发布,跨平台开发与性能全面提升

    前言 2024年2月25日,微软正式推出 .NET 10 预览版 1,标志着这一跨平台开发框架迈入新里程碑. 本次更新聚焦 JIT 编译器优化.运行时性能提升和跨平台开发体验增强,同时引入多项开发者期 ...

  5. halo配置踩坑过程小记

    写在最前: ​ 终于搞定了最后的一步域名解析配置,其实动态博客的折腾程度也不低于当时的hexo吧,也可能当时的痛苦过程已经忘了..整理一下思路,记录一下配置过程走过的坑. ​ 我是从hexo用了半年想 ...

  6. kubernetes安装配置使用vGPU

    前言 AI 落地时,在某些场景下 AI 模型在训练或者是推理时,其算力要求不需要占用整卡的 GPU,比如只需要0.5卡 GPU 即可满足需求. 在这种情况下,可以使用 GPU 虚拟化技术来解决这个问题 ...

  7. Calico Kernel's RPF check is set to 'loose'

    前言 K8s 集群部署使用了 calico 网络插件,而calico node 节点发生如下报错: 2023-03-13 11:19:36.622 [FATAL][828] int_dataplane ...

  8. 堆排序(内置模块 heapq )(NB)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ import heapq # q->queue 优先队列 import r ...

  9. 14 个 Linux 下 CPU 监控工具

    01. top top是最常用的查看系统资源使用情况的工具,包括CPU.内存等等资源. 这里主要关注CPU资源. 1.1 /proc/loadavg load average取自/proc/loada ...

  10. 一文速通Python并行计算:01 Python多线程编程-基本概念、切换流程、GIL锁机制和生产者与消费者模型

    一文速通 Python 并行计算:01 Python 多线程编程-基本概念.切换流程.GIL 锁机制和生产者与消费者模型 摘要: 多线程允许程序同时执行多个任务,提升效率和响应性.线程分为新建.就绪. ...