文章目录

  • 一、题目
  • 二、解题思想
  • 三、代码
  • 四、复杂度分析
  • 五、算法评价

一、题目

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

示例 2:
输入:s = “cbbd”
输出:“bb”

示例 3:
输入:s = “a”
输出:“a”

示例 4:
输入:s = “ac”
输出:“a”

提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

二、解题思想

寻找回文串,核心就是串的对称。仅从一头找的话很难确定另一头的终点位置。利用回文串的对称性,我们可以

  1. 从两端出发向内寻找
  2. 也可以选定一个中心点向两端扩散。

按照第一种方式(双指针),实现起来我们会发现,两端的位置也难以确定。例如,我们选定主串的头和尾当初始子串,如果该子串不满足回文,那么下一个子串该如何寻找呢?

是左边向右移动一位?

还是右边向左移动一位?

还是左右都移动一位?

再往后列举的话,相当于穷举了,因此看来这貌似并不是一个很好的解决办法。(至少粗略来看,目前没有什么思路)

因此,我们可以选择第二种方式,以每一个字符为中心,向两端扩张寻找最大回文子串,就像这样:

当然,你会发现,我们漏了一个回文串 “adccda”,因为这个回文串长度为奇数,因此我们还需要像这样寻找:

最后比较两种情况寻找的最长回文子串哪个更长就可以啦!

三、代码

class Solution {public:// 寻找奇数长度的回文子串// s:主串// index:中心出发点// left:最长回文子串起始位置// right:最长回文子串终点位置// len:最长回文子串的长度void oddPlalindrome(const string &s, int index, int &left, int &right, int &len) {int t_len = 1, t_left = index, t_right = index;    // 临时长度、子串左右位置while (t_left >= 1 && t_right < s.size() - 1)      // 保证子串不出界{if (s[t_left - 1] != s[t_right + 1]) break;    // 向两端延展,如果不同则直接退出循环// 更新临时长度和子串位置t_len += 2;                                   --t_left; ++t_right;}// 如果这次长度更长,更新子串位置和长度if (t_len >= len){len = t_len;left = t_left;right = t_right;}}// 寻找偶数长度的回文子串void evenPlalindrome(const string &s, int index, int &left, int &right, int &len) {int t_len = 2, t_left = index, t_right = index + 1;    // 初始长度 t_len 设为 2if (s[t_left] != s[t_right]) return;                   // 如果相邻的两个字符不一样,直接退出函数// 同上while (t_left >= 1 && t_right < s.size() - 1){if (s[t_left - 1] != s[t_right + 1]) break;t_len += 2;--t_left; ++t_right;}if (t_len >= len){len = t_len;left = t_left;right = t_right;}}string longestPalindrome(string s) {int left, right, len = 0;// 以每个字符为中心,扩散寻找最大子串for (int i = 0; i < s.size(); ++i){oddPlalindrome(s, i, left, right, len);evenPlalindrome(s, i, left, right, len);}return string(s.begin() + left, s.begin() + right + 1);}
};

四、复杂度分析

时间复杂度:

一般情况下,时间复杂度为 O(n),因为 oddPlalindrome 和 evenPlalindrome 两个函数的耗时趋近于常数。

最坏情况下,时间复杂度为 O(n2),此时串中具有较长的连续相同字符或间歇周期性字符,例如 “aaaaaaaaaa”,“ababababababa”,可以在源代码基础上添加判断情况进行优化。

空间复杂度:

oddPlalindrome 和 evenPlalindrome 函数没有开辟新的大内存空间,因此复杂度为 O(1)。

五、算法评价

LeetCode 中:

执行用时:16 ms, 在所有 C++ 提交中击败了92.31%的用户

内存消耗:6.9 MB, 在所有 C++ 提交中击败了95.50%的用户

提交了很多次,整体时间稳定在 16 ~ 20ms,内存消耗稳定在 6.9 ~ 7.0ms。

LeetCode No5. 最长回文子串 题解相关推荐

  1. [动态规划|字符串] leetcode 5 最长回文子串

    [动态规划|字符串] leetcode 5 最长回文子串 1.题目 题目链接 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例1: 输入: "b ...

  2. LeetCode 5. 最长回文子串(动态规划)

    文章目录 1. 题目 2. 解题 2.1 自己写的DP 2.2 优化后的DP 2.3 中心扩展法 1. 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. ...

  3. 20200118:(leetcode)最长回文子串(中心扩展算法详解及思考)

    最长回文子串(中心扩展算法详解及思考) 题目 中心扩展算法详解 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: " ...

  4. 20200117:(leetcode)最长回文子串(暴力法)

    最长回文子串 题目 基本思路 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: ...

  5. leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  6. leetcode - 5. 最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 解题思路: 对于一个字符串,回文子串存在两种情况,第一种情况是???a???的回文子串,第二种情况是???aa ...

  7. LeetCode 516 最长回文子串

    思路: 动态规划 dp数组:dp[i][j]表示s[i:j]最长回文子串长度 出口: ●i j相同,   dp[i][j]  都为1 ●j=i+1,如果  s[j]=s[i]  dp[i][j]=2, ...

  8. LeetCode 05最长回文子串

    题目描述 描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" ...

  9. [LeetCode][M0005]最长回文子串(Java)(马拉车(Manacher)算法)

    题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注 ...

  10. leetcode 5. 最长回文子串 【马拉车】

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...

最新文章

  1. win7系统待机模式下如何分配下载方法
  2. 力扣——整数反转(Java)
  3. JDK8新特性(七)之Stream流的count()、filter()、limit()、skip()方法
  4. 【leetcode刷题笔记】Convert Sorted Array to Binary Search Tree
  5. CentOs下部署Core环境
  6. jvm中的新生代Eden和survivor区
  7. ib网卡命令_linux安装卸载IB网卡(mellanox)驱动
  8. 淘宝运营,新链接和老连接如何做搜索,有什么区别?
  9. 光头男人乐嘉:非典型主持人(图)
  10. Python - global 跨函数参数传递
  11. Layui 重载后表格内容重复 更换提交方式已解决
  12. 用Python进行文本分析时出现UnicodeDecodeError错误的解决方法
  13. 分享106个PHP源码,总有一款适合您
  14. 机器学习分类模型评价指标详述
  15. 纯css控制文字显示隐藏
  16. mpvue框架开发小程序
  17. 关闭联通游戏代扣费的功能
  18. dnf创建服务器信息失败怎么办,DNF提示图表系统组建失败怎么解决?
  19. 深度学习3—用三层全连接神经网络训练MNIST手写数字字符集
  20. Shiro实现session限制登录数量踢人下线

热门文章

  1. Rockchip | 启动引导的各个阶段及其对应固件
  2. 计算机毕业设计 SSM+Vue房屋出租系统 房屋租赁合同信息管理系统 房屋租售管理系统Java Vue MySQL数据库 远程调试 代码讲解
  3. javafx自定义分页控件的实现
  4. 南通大学计算机学院本科考研,南通大学各学院2021考研分数线已公布
  5. 线性代数中解方程组的加减消元和求特征向量的加减消元的区别
  6. java常用逻辑运算
  7. 《STL》— NYOJ STL练习 习题汇总
  8. 手机端如何维持登录状态
  9. day 55 定位流(相对,绝对,固定)
  10. 给大家分享一个QQ资料查询接口(等级,活跃,年龄,性别,身份卡)