题目

给定一个字符串S,返回S中最长的回文子串。S最长为1000,且最长回文子串是唯一。

解法

①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的回文子串长度(长度为偶数)。时间为O(N2)。

②另外,有一个很奇妙的算法,称为Manacher算法,参考 http://www.cnblogs.com/daoluanxiaozi/p/longest-palindromic-substring.html ,时间为O(N)。

代码

①直接扩展:

 class Solution {
public:
string longestPalindrome(string s) {
int start = , max_len = ;
for(int i = ; i < s.size(); ++i)
{
int left, right, len; len = ; //以当前字符为中心的回文串
for(left = i - , right = i + ; left >= && right < s.size() && s[left] == s[right]; --left, ++right)
len += ;
if(len > max_len)
{
start = left + ;
max_len = len;
} len = ; //以当前字符以及右边相邻字符为中心的回文串
for(left = i, right = i + ; left >= && right < s.size() && s[left] == s[right]; --left, ++right)
len += ;
if(len > max_len)
{
start = left + ;
max_len = len;
}
}
return s.substr(start, max_len);
}
};

②Manacher算法:

 class Solution {
public:
string longestPalindrome(string s) {
int slen = s.size();
if(slen == || slen == )
return s; const int nslen = * slen + ; //每个字符两边填充#,将奇偶长度的回文串统一处理
string ns(nslen, '#');
ns[] = '^'; //开始和结尾添加特殊字符,防止越界
ns[nslen - ] = '$';
for(int i = ; i < slen; ++i)
ns[ * i + ] = s[i]; int id = , mx = ; //id为已找到的最右回文串的中心下标,mx为该回文串的最右下标
int p[nslen]; //p保存以每个字符为中心的回文串的半径,这个半径值就是去掉填充字符之后实际回文串长度 for(int i = ; i < nslen - ; ++i)
{
p[i] = mx > i ? min(mx - i, p[ * id - i]) : ; //利用已有信息,给当前字符为中心的回文串赋半径初值 while(ns[i - - p[i]] == ns[i + + p[i]]) //向两边扩张
++p[i]; if(i + p[i] > mx)
{
mx = i + p[i];
id = i;
}
} int mid = , max_len = ;
for(int i = ; i < nslen - ; ++i) //找出最长的回文串
if(p[i] > max_len)
{
mid = i;
max_len = p[i];
} return s.substr((mid - - max_len)/, max_len); //求出回文串第一个字符的下标,返回回文串
}
};

LeetCode题解——Longest Palindromic Substring的更多相关文章

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

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

  2. LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法

    LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...

  3. LeetCode(3)题解: Longest Palindromic Substring

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

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

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

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

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

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

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

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

  8. [LeetCode][Python]Longest Palindromic Substring

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...

  9. 【LeetCode】Longest Palindromic Substring 解题报告

    DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...

随机推荐

  1. CentOS安装crontab及使用方法

    crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于 “crontab”文件中,以供之后读取和执行.通常,crontab储 ...

  2. [DP] 堆盒子问题

    给一堆盒子,知道每个盒子的三围(长宽高),盒子正面朝你,不能旋转摆放,按照大的放在小的下面的原则堆起来,必须是 strictly larger,同样大小的盒子不行,问怎么样堆到最大的高度? 思路:动态 ...

  3. 对jQuery.isArray方法的分析

    jQuery.isArray方法应于判断是不是数组,是的话返回true,否则返回false.调用如:jQuery.isArray([]),返回true.其实现源码如下: isArray: Array. ...

  4. 深入浅出 ES6:ES6 与 Babel / Broccoli 的联用

    深入浅出 ES6指的是添加在 ECMASript 标准第六版中的 JavaScript 编程语言的新特性,简称为 ES6. 虽然 ES6 刚刚到来,但是人们已经开始谈论 ES7 了,它未来的样子,以及 ...

  5. linux ubuntu关于U盘的安装 开机启动u盘的时候出现/casper/vmlinuz.efi: file not found

    将u盘下的/casper/vmlinuz文件添加一个后缀.efi即可. 重启再装.

  6. jmeter 一个可能引起性能严重下降的断言设置

    在添加断言时一定要注意: 1. 红框部分选择 "响应文本", 2.  要断言的内容越短越好

  7. Android:控件布局(相对布局)RelativeLayout

    RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ...

  8. ArcGIS学习记录—ArcGIS ArcMap编辑状态中线打断的问题

    摘要:在处理数据时,我们经常会遇到线打断的问题,比如需要指定在线上某处打断线,或者新建网络数据集时需要在线的交点处打段线等等.现将桌面版中我所遇到的线打断的工具总结如下: 在ArcGIS矢量处理数据时 ...

  9. 几种必知的oracle结构图

    一.数据库结构 二.Oracle 内存结构 三.进程结构 1. 用户进程:在数据库用户请求连接到Oracle 服务器时启动 2. 服务器进程:可以连接到Oracle实例,它在用户建立会话时启动 3. ...

  10. 【HDOJ】2459 Maximum repetition substring

    后缀数组+RMQ. /* 2459 */ #include <iostream> #include <sstream> #include <string> #inc ...