【转载请注明】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. CF51F Caterpillar (边双+树形DP)

    题目传送门 题目大意:给你一张n个点m条边的图.每次操作可以把两个点合并成一个(与之相连的边也都要连到新点上).求把图中每个联通块都变成“毛毛虫”的最小操作次数.“毛毛虫”必须是一棵树(可以存在自环) ...

  2. Spring框架学习之SpringAOP(二)

    AOP概念 AOP(Aspect-Oriented Programming,面向切面编程),AOP是OOP(面向对象编程)的补充和完善 AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用 ...

  3. 使用Robo 3T 软件管理MongoDB数据库如何执行命令行shell

    比如使用命令行的方式查看数据库runoobdb中的sites集合(数据表)中的所有数据 1.在连接名的地方鼠标右键选择“open shell” 2.在出现的shell窗口中输入一下命令行,然后按ctr ...

  4. hdu 3549 最大流

    #include<stdio.h> #include<string.h> #include<queue> #include<iostream> usin ...

  5. 利用C语言中的函数指针实现c++中的虚函数

    C语言中的函数指针 #include<stdio.h> int fun1(int a) { return a*a; } int fun2(int a) { return a*a*a; } ...

  6. Spring MVC-视图解析器(View Resolverr)-XML视图解析器(Xml View Resolver)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_xmlviewresolver.htm 说明:示例基于Spring MVC 4.1 ...

  7. 固定一个div在浏览器底部

    转自原文 如何固定一个div在浏览器底部   方法1:使用CSS绝对定位 div{ position:absolute; bottom:0px; left:0px; } 方法2:使用CSS固定定位 d ...

  8. iOS分组通讯录效果+側滑菜单(MMDrawerController)

    前言的废话-能够忽略 自从学会了使用Cocoapod,就欲罢不能了!由于太简单太赞了,不用再把源代码粘到project里了! 參见戴维营博客中的解说:Cocoapod 安装以及使用 先上一下效果图,请 ...

  9. ADS-B显示终端6.8

    更新日志; 本次更新依旧主要注重是BUG修正. 1 改动鼠标移动时地图重绘的BUG 鼠标移动时地图即发生重绘,占用了CPU资源,修正后仅仅当鼠标点击选中对象或拖动对象时地图才会发生重绘.极大程度上节省 ...

  10. 如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)

    官方有一个用于SharePoint的demo用的虚拟机: 2010 Information Worker Demonstration and Evaluation Virtual Machine (S ...