【转载请注明】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"
Note: "aba" is also a valid answer.

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 最长回文串的更多相关文章

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

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

  2. Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

    Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...

  3. lintcode :Longest Palindromic Substring 最长回文子串

    题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...

  4. 1. Longest Palindromic Substring ( 最长回文子串 )

    要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...

  5. LeetCode:Longest Palindromic Substring 最长回文子串

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

  6. 【翻译】Longest Palindromic Substring 最长回文子串

    原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...

  7. [leetcode]5. Longest Palindromic Substring最长回文子串

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

  8. 转载-----Java Longest Palindromic Substring(最长回文字符串)

    转载地址:https://www.cnblogs.com/clnchanpin/p/6880322.html 假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic st ...

  9. Longest Palindromic Substring (最长回文字符串)——两种方法还没看,仍需认真看看

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

随机推荐

  1. 洛谷 2387 NOI2014魔法森林 LCT

    [题解] 我们先把边按照$a$值从小到大排序,并按照这个顺序加边. 如果当前要加入的边连接的两点$u$与$v$已经是连通的,那么直接加入这条边就会出现环.这时我们需要删除这个环中$b$值最大的边.因此 ...

  2. 00107_TCP通信

    1.TCP通信的概述 (1)TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象: (2)区别在于: ①UDP中只有发送端和接收端,不区分客户端与服务器端,计 ...

  3. nyoj_264_国王的魔镜_201311271800

    国王的魔镜 时间限制:3000 ms  |           内存限制:65535 KB 难度:1   描述 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部 ...

  4. hdu_1005_Number Sequence_201310222120

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. 【ACM】hdu_1091_A+BIII_201307261112

    A+B for Input-Output Practice (III)Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/327 ...

  6. 洛谷 P2965 [USACO09NOV]农活比赛The Grand Farm-off

    P2965 [USACO09NOV]农活比赛The Grand Farm-off 题目描述 Farmer John owns 3*N (1 <= N <= 500,000) cows su ...

  7. Java下用Jackson进行JSON序列化和反序列化(转)

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...

  8. MVC.Net:Razor指定模板

    在MVC.Net开发中,我们通常会在_ViewStart.cshtml中指定一个默认的模板,在文件开头输入如下代码: @{ Layout = "~/Views/Shared/[自己定义的模板 ...

  9. 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 ...

  10. Unity3d-反编译C#和提取资源

    使用MonoDevelop查看代码 1.解压缩一个Ipa文件,找到如下目录 2.拖拽一个Assembly-CSharp.dll文件到MonoDevelop工具栏,即可查看C#代码 其他C#反编译工具: ...