LeetCode 5 最长回文子串 manacher算法
时间:2019-02-17
本文章向大家介绍LeetCode 5 最长回文子串 manacher算法,主要包括LeetCode 5 最长回文子串 manacher算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
https://leetcode-cn.com/problems/longest-palindromic-substring/
题意:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
思路:
直接用算法,复杂度。另外还有一种很迷的算法,有时候会比算法跑的还快,自行体会。
代码:
manacher算法
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() == 0)
return s;
string cs(2*s.size() + 2, '#');
for(int i = 0; i < s.size(); i++) {
//cs[2*i] = '#';
cs[2*i+2] = s[i];
}
cs[0] = '?';
int k = 0, extk = 0, index = 0;
vector<int> p(2*s.size() + 2, 0);
for(int i = 2; i < cs.size(); ++i) {
if(i < extk) {
p[i] = min(extk-i, p[2*k-i]);
} else {
p[i] = 1;
}
while(i + p[i] < cs.size() && cs[i+p[i]] == cs[i-p[i]])
p[i]++;
if(i + p[i] > extk) {
k = i, extk = i + p[i];
if(p[i] > p[index])
index = i;
}
}
return s.substr((index-p[index]+2)/2-1, p[index]-1);
}
};
迷之算法
class Solution {
public:
string longestPalindrome(string s) {
int index = 0, ans = 0;
for(int i = 0; i < s.size(); i++) {
int l = i, r = i;
while(r+1 < s.size() && s[r+1] == s[i])
r++;
while(l-1 >= 0 && r+1 < s.size() && s[l-1] == s[r+1])
l--, r++;
if(r - l + 1 > ans) {
index = l;
ans = r - l + 1;
}
}
return s.substr(index, ans);
}
};
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 代码详解——《无人驾驶车辆模型预测控制》3.3.3参考路径更改
- MySQL redo与undo日志解析
- 样本不平衡造成的影响和解决方案
- 代码详解——NMPC路径跟踪复杂参考路径设置
- 代码详解——NMPC之加入控制平顺性惩罚项
- 代码详解——采用控制增量作为控制输入的NMPC路径跟踪
- 程序员进阶系列:年少不懂爱家家,懂了已是猿中人。
- 代码详解——Simulink中的运动学模型
- Spring Boot 特性之 Failure Analysis
- 「周末福报」头铁的我,一头扎进了知识盲区 ThreadLocal
- 「周末福报」如何高效使用 Kryo
- 「刷题警告」递归算法
- 轻松学Pytorch – 构建生成对抗网络
- 「周末福报」你了解 SPI 吗?
- 「周末福报」如何实现一棵二叉树?