博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法刷题】-最长回文子串
阅读量:3929 次
发布时间:2019-05-23

本文共 3596 字,大约阅读时间需要 11 分钟。

微信搜索:编程笔记本。获取更多干货!

微信搜索:编程笔记本。获取更多干货!

点击上方蓝字关注我,我们一起学编程

欢迎小伙伴们分享、转载、私信、赞赏

最长回文子串

文章目录

所谓回文串,就是正序和逆序都相同的子串(上海自来水来自海上)。子串是原字符串的连续部分,这区别于子序列。

微信搜索:编程笔记本。获取更多干货!

微信搜索:编程笔记本。获取更多干货!

1. 暴力枚举法

时间复杂度:O(n^3)

空间复杂度:O(1)

class Solution {
public: string longestPalindrome(string s) {
int len = s.size(); if (len <= 1) {
return s; } int maxLen = 1; /* 回文串的最大长度 */ int begin = 0; /* 回文串的起始下标 */ for (int i = 0; i < len - 1; ++i) {
/* 从大于最大长度的位置开始遍历 */ for (int j = i + maxLen ; j < len; ++j) {
if (isPalindrome(s, i, j)) {
maxLen = j - i + 1; begin = i; } } } return s.substr(begin, maxLen); } /* 判断是否为回文串 */ bool isPalindrome(const string& s, int start, int end) {
bool ispalindrome = true; while (start < end) {
if (s[start++] != s[end--]) {
ispalindrome = false; break; } } return ispalindrome; }};

2. 中心扩展法

分析:

微信搜索:编程笔记本。获取更多干货!

微信搜索:编程笔记本。获取更多干货!

枚举所有可能的回文子串的中心位置,中心位置可能是一个字符(奇数长度),也可能是两个相邻的字符(偶数长度)。

时间复杂度:O(n^2)

空间复杂度:O(1)

class Solution {
public: string longestPalindrome(string s) {
int len = s.size(); if (len <= 1) {
return s; } int maxLen = 1; /* 回文串的最大长度 */ int begin = 0; /* 回文串的起始下标 */ for (int i = 0; i < len - 1; ++i) {
int oddLen = expandAroundCenter(s, i, i); /* 回文串的中心为单个字符 */ int evenLen = expandAroundCenter(s, i, i + 1); /* 回文串的中心为两个相邻的字符 */ int curMaxLen = max(oddLen, evenLen); if (curMaxLen > maxLen) {
maxLen = curMaxLen; begin = i - (maxLen - 1) / 2; /* 计算当前最大回文串的起始下标 */ } } return s.substr(begin, maxLen); } /* 从中心往两边扩展,寻找最长回文子串的长度 */ int expandAroundCenter(const string& s, int left, int right) {
int len = s.size(); int i = left; int j = right; while (i >= 0 && j < len) {
if (s[i] == s[j]) {
--i; ++j; } else {
break; } } return j - i - 1; }};

3. 动态规划法

分析:

状态: dp[i][j] 表示子串 s[i...j] 是否为回文子串;

状态转移方程:dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1]
初始化:dp[i][i] = true
输出:在得到一个状态的值为 true 的时候,记录起始位置和长度,填表完成以后再截取。

微信搜索:编程笔记本。获取更多干货!

微信搜索:编程笔记本。获取更多干货!

时间复杂度:O(n^2)

空间复杂度:O(n^2)

class Solution {
public: string longestPalindrome(string s) {
int len = s.size(); if (len <= 1) {
return s; } int maxLen = 1; /* 回文串的最大长度 */ int begin = 0; /* 回文串的起始下标 */ vector
> dp(len, vector
(len, true)); for (int j = 1; j < len; ++j) {
for (int i = 0; i < j; ++i) {
if (s[i] != s[j]) {
dp[i][j] = false; } else {
dp[i][j] = (j - i <= 2) ? true : dp[i + 1][j - 1]; } if (dp[i][j] && j - i + 1 > maxLen) {
maxLen = j - i + 1; begin = i; } } } return s.substr(begin, maxLen); }};

4. Manacher 算法

时间复杂度为 O(n) 。该算法十分复杂,有兴趣的童鞋可以自己查阅相关资料。

微信搜索:编程笔记本。获取更多干货!

微信搜索:编程笔记本。获取更多干货!

你可能感兴趣的文章
Html制作漂亮表格
查看>>
android图片特效处理之怀旧效果
查看>>
android图片特效处理之锐化效果
查看>>
android图片特效处理之光晕效果
查看>>
JSP之JDBC操作Sql Server数据库
查看>>
Android学习笔记之RadioButton RadioGroup
查看>>
Android学习笔记进阶15之Shader渲染
查看>>
Java学习笔记之FreeTTS(语音)
查看>>
Android 给图片加边框
查看>>
获取JDBC中的ResultSet的记录的条数
查看>>
android图像处理(3)底片效果
查看>>
android图像处理(3)浮雕效果
查看>>
ExtJs 表格的实现
查看>>
题目1085 拦截导弹
查看>>
Kafka 为什么使用kafka
查看>>
Android开发技巧不同状态的Button
查看>>
CSS 鼠标经过时改变table所在行的颜色
查看>>
某机字长为32位 存储容量为64MB 若按字节编址 它的寻址范围是多少
查看>>
C 实现在Sql Server中存储和读取Word文件
查看>>
Java笔记之JTextField JTextArea区别
查看>>