最长回文子串(动规,中心扩散法,Manacher算法)
题目
leetcode:5. Longest Palindromic Substring
解法
动态规划
时间复杂度\(O(n^2)\),空间复杂度\(O(n^2)\)
基本解法直接看代码
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
vector<vector<bool>> dp(n, vector<bool>(n, true));
int rx, ry;
rx = ry = 0;
for(int l = 1; l < n; l++){
for(int i = 0; i < n - l; i++){
int j = i + l;
if(s[i] == s[j] && (j - i < 3 || dp[i+1][j-1])){
dp[i][j] = true;
if(j - i > ry - rx){
ry = j;
rx = i;
}
} else {
dp[i][j] = false;
}
}
}
return s.substr(rx, ry - rx + 1);
}
};
中心扩散法
时间复杂度\(O(n^2)\),空间复杂度\(O(1)\)
我们先假定以某点为中心向两端扩散,找到以该点为中心的最长回文子串
class Solution {
public:
int rx, ry;
void helper(string &s, int i, int offset){
int left = i;
int right = i + offset;
while(left >= 0 && right < s.size() && s[left] == s[right]){
left--;
right++;
}
if(right - 1 - (left + 1) > ry - rx){
ry = right - 1;
rx = left + 1;
}
}
string longestPalindrome(string s) {
int n = s.size();
rx = ry = 0;
for(int i = 0; i < n; i++){
helper(s, i, 0);
helper(s, i, 1);
}
return s.substr(rx, ry - rx + 1);
}
};
Manacher算法
Manacher算法俗称“马拉车算法”,时间复杂度\(O(n)\),空间复杂度\(O(n)\)
因为回文字符串都有奇数长度的串和偶数长度的串,为了更好处理这两种情况,可以在字符串中插入一特殊字符'#',使得新字符串长度全变为奇数长度,如"aa"变为"#a#a#",可以再字符串首部加入另一特殊字符'$'和尾部的'@',这样就不用特殊处理越界问题(统一边界处理)
以"122112321"为例经过上一步变成"@#1#2#2#1#1#2#3#2#1#"
Manacher算法使用一个辅助数组r[i]表示以t[i]为中心的最长回文子串的最右字符到t[i]的长度,如以t[i]为中心的最长回文子串为t[low, high],则r[i] = high - i + 1, t[low, high] = 2 * r[i]-1, len数组有一个性质,就是r[i]-1为该回文子串在原串中的长度,证明很简单t[lowl, high]一定是以"#"开头和结尾的,这样插入的"#"是原来串中字符的两倍还多一个,这样原串中最长回文串的长度就为r[i]-1,这样问题就转为求最长的r[i]
计算len数组
算法主要利用了已有的回文子串的特点,减少了查找时间,从左往右计算len[i],同时保存一个之前计算最长回文子串的右端点的最大值R及对应的中心位置c,
- i < R, 则先找i关于c对称点j=2*c-i,则至少r[i] \(\geq\) min(R - i + 1, p[j]), 超出部分再手工匹配
- i >= R, 则不能利用以后的知识做任何假设,只能假定其至少为1,再手工匹配
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if(n == 0) return "";
string ns;
ns.push_back('$');
for(int i = 0; i < n; i++){
ns.push_back('#');
ns.push_back(s[i]);
}
ns.push_back('#');
ns.push_back('@');
n = ns.size();
vector<int> r(n);
int c, R, C, MAX;
R = -1;
MAX = 0;
C = 0;
for(int i = 1; i < n; i++){
r[i] = i < R ? min(r[2 * c - i], R - i + 1) : 1;
while(ns[i + r[i]] == ns[i - r[i]]) r[i]++;
r[i]--;
if(i + r[i] > R){
R = i + r[i];
c = i;
}
if(r[i] > MAX){
MAX = r[i];
C = i;
}
}
return s.substr((C-MAX)/2, r[C]);
}
};
时间复杂度分析
参考
最长回文子串(动规,中心扩散法,Manacher算法)的更多相关文章
- 【转】最长回文子串的O(n)的Manacher算法
Manacher算法 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长.这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文 ...
- Leetcode(5)-最长回文子串(包含动态规划以及Manacher算法)
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)
最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...
- 【LeetCode】最长回文子串【动态规划或中心扩展】
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...
- 【LeetCode】最长回文子串-中心扩展法
[问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...
- 51nod 1088 最长回文子串 【中心拓展法/输出长度和路径】
1088 最长回文子串 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字 ...
- 最长回文子串-LeetCode 5 Longest Palindromic Substring
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 最长回文子串(Longest Palindromic Substring)
这算是一道经典的题目了,最长回文子串问题是在一个字符串中求得满足回文子串条件的最长的那一个.常见的解题方法有三种: (1)暴力枚举法,以每个元素为中心同时向左和向右出发,复杂度O(n^2): (2)动 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
随机推荐
- [笔记] 使用v2r访问外网
介绍 首先,你需要有一台能上外网的服务器,如AWS,GCP等. 其次,请自行复制全文,然后将FXXK替换为v2r的全称(5个小写字符). 服务器上Docker镜像配置流程 拉取镜像 $ sudo do ...
- 1004: [递归]母牛的故事(python):(本地测试正确;但提交不对!!??)求教
时间限制: 1Sec 内存限制: 128MB 提交: 28438 解决: 8320 题目描述 有一头母牛,它每年年初生一头小母牛.每头小母牛从第四个年头开始,每年年初也生一头小母牛.请编程实现在第n年 ...
- cef加载flash的办法
cef有2种加载flash插件的方式, 1,npapi,这种方式是调用系统自带的flash插件,由于有安全性方面的问题,已经被新版cef禁用. 2,ppapi,也就是 pepper flash,这是谷 ...
- 爱伪装(AWZ)/爱立思(ALS)改机改串一键新机原理分析
简介 爱伪装(AWZ)/爱立思(ALS)是一款iOS越狱系统上的改机工具,可以修改多种系统参数达到伪装设备型号及各种软硬件属性的目的,同时提供了防越狱检测机制,常用于iOS上的推广刷量,配合代理/VP ...
- UOJ#548.数学
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #inc ...
- MariaDB(第三章)select
基本查询 ``` --查询基本使用(条件,排序,聚合函数,分组,分页) --创建学生表 create table students ( id int unsigned not null auto_in ...
- mint ui解决Navbar和Infinite scroll共存时的bug
Navbar和Infinite scroll共同使用时会出现无限加载的问题,滑动也会出现乱加载. 只需要判断一下就可以了,代码: html: <mt-navbar v-model="s ...
- WinForm笔记1:TextBox编辑时和DataGridView 单元格编辑时 的事件及其顺序
TextBox 编辑框 When you change the focus by using the mouse or by calling the Focus method, focus event ...
- ciscn-华北赛区-Day1-Web2题解
漏洞点 薅羊毛逻辑漏洞 Cookie伪造 -> JWT python反序列化 -> 反弹shell 薅羊毛逻辑漏洞 打开题目是这样一个页面 其实最初的题目这个募集资金的进度条是没有刷满的, ...
- Django2.2 会话技术cookie session token的区别以及实例介绍
一.区别: 本人见解:使用自定义数据项进行加密,作为唯一身份识别,登陆时写入cookie(session基于这个).在显示相关数据 1.cookie 属于客户端会话技术(数据存储在客户端) 默认的Co ...