LeetCode题解——Longest Palindromic Substring
题目:
给定一个字符串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的更多相关文章
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- LeetCode(3)题解: Longest Palindromic Substring
https://leetcode.com/problems/longest-palindromic-substring/ 题目: Given a string S, find the longest ...
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...
- LeetCode 5 Longest Palindromic Substring(最长子序列)
题目来源:https://leetcode.com/problems/longest-palindromic-substring/ Given a string S, find the longest ...
- 【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 ...
- leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...
- [LeetCode][Python]Longest Palindromic Substring
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/longest ...
- 【LeetCode】Longest Palindromic Substring 解题报告
DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...
随机推荐
- 可编辑的select框的实现(实用版)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEA ...
- 如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数
1 案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...
- 【mysql的编程专题⑥】视图
视图是表的一个映射,是一张虚表,在结构上视图和普通的表没什么区别,一样可以用sql语句来增删改查; 视图创建后是一直存在数据库内 操作 创建视图 语法 CREATE [ALGORITHM]={UNDE ...
- Android:使用ViewPager实现左右滑动切换图片 (简单版)
ViewPager,它是google SDk中自带的一个附加包的一个类, 可以使视图滑动. 步骤: 1.引入android-support-v4.jar包,在主布局里加入 <android.su ...
- MSSQLServer基础04(常用函数)
类型转换函数 CAST ( expression AS data_type) CONVERT ( data_type, expression,[style]) 对日期的转换.转换成各种国家格式的日期. ...
- P134、面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4,5,3,2,1是该压栈序列对 ...
- c++编写webui内核 .
http://blog.csdn.net/sx1989827/article/details/8068779 #pragma once #include <mshtmhst.h> #inc ...
- bochs编译安装
1.安装依赖sudo apt-get install gtk2.0-devsudo apt-get install xorg-dev 2.配置 ./configure --enable-debugge ...
- 在Ubuntu 12.04安装和设置SSH服务
1.安装 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可. 安装ssh-server sudo apt-get ins ...
- 过虑器 ThreadLocal 权限 监听器 观察者模式
数据的压缩 GzipOutputStream - > > ByteArrayOutputStream. 以下是在某个servlet中对指定的数据进行压缩 package cn.itcast ...