5_Longest Palindromic Substring(Manacher) --LeetCode
参考:https://www.felix021.com/blog/read.php?2040,https://segmentfault.com/a/1190000002991199 做了修改。
首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。 为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#a#b#a#(注意,下面的代码是用C语言写就,由于C语言规范还要求字符串末尾有一个'\0'所以正好OK,但其他语言可能会导致越界)。
下面以字符串12212321为例,经过上一步,变成了 S[] = "$#1#2#2#1#2#3#2#1#";
原帖中需要用一个数组 P[i] 来记录以字符S[i]为中心的最长回文子串向左/右扩张的长度(包括S[i],也就是把该回文串“对折”以后的长度),比如S和P的对应关系:
S # 1 # 2 # 2 # 1 # 2 # 3 # 2 # 1 #
P 1 2 1 2 5 2 1 4 1 2 1 6 1 2 1 2 1
(p.s. 可以看出,P[i]-1正好是原字符串中回文串的总长度)
但我不采用以上的做法,我的算法思想如下:
从S的下标1开始遍历到下标S.length()-2做如下操作
1) 假设偏移量为offset, 用一个while循环控制在对比 S[i-offset] 和第 S[i+offset] 的字符是否相等,每次循环offset自增,直到S[i-offset] 不等于S[i+offset] 或者i-offset<1或者i+offset>S.length()-1跳出循环。
2) 使用一个变量maxlength记录最长回文子串向左/右扩张的长度,以及一个maxidx记录当前最大回文串的中心位置,判断当前的offset与maxlength的大小,取较大赋值给maxlength。
3) 根据maxidx找到最大回文的中心位置,再根据其maxlength计算出回文串的起始位置以及长度。再使用substr()方法将回文串截取出来。如str.substr(maxidx-maxlength+1,2*maxlength-1);
4) 去掉其中的 ‘#’字符,就得到回文串。
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
//小于1的字符串免处理,直接返回
if(s.size()<=){
return s;
}
int len = s.size();
string str = preProcess(s);
//使用一个变量maxlength记录最长回文子串向左/右扩张的长度,以及一个maxidx记录当前最大回文串的中心位置,判断当前的offset与maxlength的大小,取较大赋值给maxlength。
int offset,maxidx = ,maxlength = ;
for(int cur = ; cur < str.size()-; ++cur){
//查找最大回文串
offset = ;
while(cur-offset>= && cur+offset < str.size() && str[cur-offset] == str[cur+offset]) {
++offset;
}
//更新maxlength
if(maxlength < offset){
maxlength = offset;
maxidx = cur;
}
}
//截取最长回文串
string longeststr = str.substr(maxidx-maxlength+,*maxlength-);
//去除"#"字符
string result = "";
for(int i = ; i<longeststr.size();i++){
if(longeststr[i]!='#')
result+=longeststr[i];
}
return result;
}
private:
//预处理
string preProcess(string s){
string str = "$";
int len = s.size();
for(int i = ; i<len; i++)
{
str+="#";
str+=s[i];
}
str+="#";
return str;
}
};
5_Longest Palindromic Substring(Manacher) --LeetCode的更多相关文章
- [LeetCode] Longest Palindromic Substring(manacher algorithm)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- leetcode 第五题 Longest Palindromic Substring (java)
Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You may ...
- 5. Longest Palindromic Substring (DP)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- LeetCode:5. Longest Palindromic Substring(Medium)
原题链接:https://leetcode.com/problems/longest-palindromic-substring/description/ 1. 题目要求:找出字符串中的最大回文子串 ...
- Leetcode 之Longest Palindromic Substring(30)
很经典的一道题,最长回文子串,有多种方法. 首先介绍的一种方法是从中间向两边展开.注意区分aba和abba型的回文串:如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断. //从中间向两边展 ...
- leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- LeetCode 5_Longest Palindromic Substring
LeetCode 5_Longest Palindromic Substring 题目描写叙述: Given a string S, find the longest palindromic sub ...
- O(n)回文子串(Manacher)算法
O(n)回文子串(Manacher)算法 资料来源网络 参见:http://www.felix021.com/blog/read.php?2040 问题描述: 输入一个字符串,求出其中最大的回文子串. ...
随机推荐
- 十二条Linux运维面试必备经典笔试/面试题
1.Linux设置环境变量 暂时的:export MYNAME="new name" echo $MYNAME new name 永久的:通过改变/etc/profile实现 EG ...
- 使用facebook和twitter进行分享经验总结
凤凰涅槃,浴火重生. 在传说当中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于在人间的所有痛苦和恩怨情仇,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和与幸福.同样在肉体经受了巨大的痛 ...
- spring之集合注入
list: <bean id="userAction" class="com.xx.action.UserAction"> <property ...
- Spring MVC Mock demo
package com.niwodai.mem.web.controller; import com.alibaba.fastjson.JSON; import org.junit.Before; i ...
- StringBuffer和String需要注意的
首先,StringBuffer的toString方法和String的subString方法都是在新生成了一个新的String. 最近做的一个功能,多线程的从SQLite数据库中读取数据.将数据拼成在M ...
- Java版网络爬虫基础
网络爬虫不仅仅可以爬取网站的网页,图片,甚至可以实现抢票功能,网上抢购,机票查询等.这几天看了点基础,记录下来. 网页的关系可以看做是一张很大的图,图的遍历可以分为深度优先和广度优先.网络爬虫采取的广 ...
- [Sdoi2017]树点涂色 [lct 线段树]
[Sdoi2017]树点涂色 题意:一棵有根树,支持x到根染成新颜色,求x到y颜色数,求x子树里点到根颜色数最大值 考场发现这个信息是可减的,但是没想到lct 特意设计成lct的形式! 如何求颜色数? ...
- vuex学习笔记
一.vuex的目的 把组件的共享状态抽取出来,以一个全局单例模式管理.在这种模式下,组件树构成了一个巨大的视图,不管在树的哪个位置,任何组件都能获取状态或触发行为. 二.vuex集中式管理数据 安装 ...
- Windows Azure Storage (25) Azure Append Blob
<Windows Azure Platform 系列文章目录> 在笔者之前的文章中,我们介绍了Azure Blob 有两种:Block Blob和Page Blob. 在这里笔者介绍Blo ...
- 阿里云 virtual memory exhausted: 无法分配内存
在阿里云买了个云服务器,内存1G.编译php时出现下面的错误: virtual memory exhausted: Cannot allocate memory 问题原因:由于物理内存本身很小,且阿里 ...