Leetcode0005--Longest Palindromic Substring 最长回文串
【转载请注明】http://www.cnblogs.com/igoslly/p/8726771.html
来看一下题目:
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" Example: Input: "cbbd" Output: "bb" |
题目意思: 给出字符串中最长的回文串 若长度相同,给出位置最前的 |
作为较经典的题目,回文串通常有几种方法,已经有很多人分析过了,提供链接:https://segmentfault.com/a/1190000005063336
总的来说:
1、穷举法
对于长度为 n 的字符串,有字符串 n(n+1)/2 ,判断是否回文串复杂度为 O(n),算法整体复杂度为 O(n^3)
2、中心扩展法
对于回文串,从对称轴展开的字符均相同;把字符串的每个位置作为回文串的对称轴,判断回文串的最大长度;子串对称轴遍历复杂度为O(n),回文判断O(n)
这里要注意:长度为奇数 / 偶数时,对称轴的位置不同
class Solution {
public:
int max=;
string res="";
string longestPalindrome(string s) {
if(s.size()==){return s;}
int len=s.size();
for(int i=;i<len-;i++){
// 字符串从0 ~ len-2位置,i&i进行奇数判断,i&i+1进行偶数判断
check(s,i,i);
check(s,i,i+);
}
return res;
}
// 判断回文串最大长度
void check(string s,int i,int j){
while(i>=&&j<s.size()){
// 若两边扩展字符相等,更新最大长度
if(s[i]==s[j]){
if(j-i+>max){
max=j-i+;
res=s.substr(i,max);
}
i--;
j++;
}else{
return;
}
}
}
};
给出一个Leetcode大神的代码,也是以中心扩展法为基本思想
class Solution {
public:
string longestPalindrome(string s) {
// 去除长度为0、1情况
if (s.empty()) return "";
if (s.size() == ) return s;
// 记录最长回文串的起始位置、最大长度
int min_start = , max_len = ;
for (int i = ; i < s.size();) {
if (s.size() - i <= max_len / ) break;
int j = i, k = i; // 以i作为中心位置,进行两边扩展
// 若中心毗邻字符串,则直接包含在内;因为中心位置相同字母必然对称
while (k < s.size()- && s[k+] == s[k]) ++k; // Skip duplicate characters.
i = k+;
// 以j,k向两边扩展,进行比较更新
while (k < s.size()- && j > && s[k + ] == s[j - ]) { ++k; --j; } // Expand.
int new_len = k - j + ;
if (new_len > max_len) { min_start = j; max_len = new_len; }
}
return s.substr(min_start, max_len);
}
};
3、Manacher算法
俗称“马拉车算法”,是在中心扩展法的基础上,优化确定最大长度的算法;
专门设定长度数组(假设为p[len]),记录每个位置的最大长度;
为了避免长度奇偶问题,在原字符串的中间,插入‘#’异常符号;
举个例子:
s="abbahopxpo"
转换为
s_new="$#a#b#b#a#h#o#p#x#p#o#"
有较为形象具体的说明:https://segmentfault.com/a/1190000008484167
实现代码:
string add_string(string s){
string news="$#";
int len=s.size();
int j=;
for(int i=;i<len;i++){
news+=s[i];
news+='#';
}
return news;
}
class Solution {
public:
string longestPalindrome(string s) {
s=add_string(s);
int len=s.size(),maxlen=-;
int id,mx=,p[len],maxindex;
for(int i=;i<len;i++){
if(i<mx) {p[i]=min(p[*id-i],mx-i);
}else{p[i]=;} while(s[i-p[i]]==s[i+p[i]]) p[i]++;
if(mx<i+p[i]){
id=i;
mx=i+p[i];
}
if(maxlen<p[i]-){
maxlen=p[i]-;
maxindex=i;
}
}
string result="";
for(int i=maxindex-maxlen;i<=maxindex+maxlen;i++){
if(s[i]!='#'&&s[i]!='$'){
result+=s[i];
}
}
return result;
}
};
Leetcode0005--Longest Palindromic Substring 最长回文串的更多相关文章
- [LeetCode] 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(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- lintcode :Longest Palindromic Substring 最长回文子串
题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...
- 1. Longest Palindromic Substring ( 最长回文子串 )
要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 【翻译】Longest Palindromic Substring 最长回文子串
原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...
- [leetcode]5. Longest Palindromic Substring最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 转载-----Java Longest Palindromic Substring(最长回文字符串)
转载地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic st ...
- Longest Palindromic Substring (最长回文字符串)——两种方法还没看,仍需认真看看
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
随机推荐
- 洛谷 2387 NOI2014魔法森林 LCT
[题解] 我们先把边按照$a$值从小到大排序,并按照这个顺序加边. 如果当前要加入的边连接的两点$u$与$v$已经是连通的,那么直接加入这条边就会出现环.这时我们需要删除这个环中$b$值最大的边.因此 ...
- 00107_TCP通信
1.TCP通信的概述 (1)TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象: (2)区别在于: ①UDP中只有发送端和接收端,不区分客户端与服务器端,计 ...
- nyoj_264_国王的魔镜_201311271800
国王的魔镜 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部 ...
- hdu_1005_Number Sequence_201310222120
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 【ACM】hdu_1091_A+BIII_201307261112
A+B for Input-Output Practice (III)Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/327 ...
- 洛谷 P2965 [USACO09NOV]农活比赛The Grand Farm-off
P2965 [USACO09NOV]农活比赛The Grand Farm-off 题目描述 Farmer John owns 3*N (1 <= N <= 500,000) cows su ...
- Java下用Jackson进行JSON序列化和反序列化(转)
Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...
- MVC.Net:Razor指定模板
在MVC.Net开发中,我们通常会在_ViewStart.cshtml中指定一个默认的模板,在文件开头输入如下代码: @{ Layout = "~/Views/Shared/[自己定义的模板 ...
- Codeforces Round #305 (Div. 2) D题 (线段树+RMQ)
D. Mike and Feet time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Unity3d-反编译C#和提取资源
使用MonoDevelop查看代码 1.解压缩一个Ipa文件,找到如下目录 2.拖拽一个Assembly-CSharp.dll文件到MonoDevelop工具栏,即可查看C#代码 其他C#反编译工具: ...