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 ...
随机推荐
- 然爸读书笔记(2014-10)----Bootsrap用户手册
本来其实这方面的知识,可以直接在网站上看,但是自己是web前端的小白.基本不懂.所以,还是买一本书来看,更好些.体现出我对前端的重视. Bootstrap是快速开发Web应用程序的前端工具包.它是一个 ...
- mysql 跨库JOIN
现有两台MYSQL数据库 一台是192.168.1.1 端口3306 上有数据库DB1 有表TABLE1一台是192.168.1.2 端口3307 上有数据库DB2 有表TABLE2192.168.1 ...
- hibernate简介(Session,几种状态,方法······等)
1.Hibernate是什么? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数 ...
- SQL的表连接
每天给自己扫盲,让自己变得越博学. 继续学习<程序员的SQL金典>,这回我们来看看表连接相关的内容.表连接的相关知识在实际的项目开发当中,使用非常广. 所谓表连接,就是通过关联多张表,从而 ...
- 全面学习cookies
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(五) 本来想自己总结的,但是某文总结太好了(http://www.cnblogs.com ...
- (转)关于Struts 2 拦截器参数丢失问题
from:http://www.cnblogs.com/huzx/archive/2011/06/09/2076328.html 今天在做用户的登陆认证的时候出现的问题. 在传参数的时候,发现参数丢失 ...
- discuz云平台报调用远程接口失败的问题分析和解决
根据网络两篇文章整理 问题描述:当开通或关闭某个云平台服务的时候,报如下错误信息:调用远程接口失败.请检查您的服务器是否处于内网以及您服务器的防火墙设置. 云平台测试站点的接口文件正常,于是开始在文件 ...
- 在线学习SQL语句?没问题~~
以前弄得少,没注意.. http://sqlfiddle.com/ CREATE TABLE Presidents ( Id INT UNSIGNED NOT NULL AUTO_INCREMENT, ...
- HDU2110+母函数
/* 母函数(生成函数) 题意: 有n种资产,每种资产num份,每份有val的价值 问取出总价值的1/3有多少种方案 */ #include<stdio.h> #include<st ...
- codeforces #305 div1 done
总算搞定了这一场比赛的题目,感觉收获蛮大 其中A,B,C都能通过自己的思考解决掉 D题思路好神,E题仔细想想也能想出来 以后坚持每两天或者一天做一场CF的div1的全套题目 除非有实在无法做出来的题目 ...