JYT's First Post
2022-07-12
1 简介
这是JYT的第一篇hexo博客,主要目的是熟悉markdown语言的语法以及hexo博客的发布。主要内容是分享leetcode上一道执行时间0ms的c++程序题解。
2 问题与题解
2.1 问题描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例1
1 | 输入:s = "babad" |
示例2
1 | 输入:s = "cbbd" |
2.2 算法思想
- 1 动态规划算法
若字符串的某一子串是回文的,那么当其去掉首尾两字符后所得的新字串仍是回文的。该算法逻辑较为复杂,本题采用中心扩展算法。
- 2 中心扩展算法
先从较短的回文子串开始,例如”babad”的”a”或者”cbbd”的”bb”,标记该子串的首尾位置并分别向前后进行遍历,若首位置前一字符与尾位置后一字符相等,则移动首尾位置,直至出现不等。较短子串可能为单字符或者连续多字符,需分别讨论。遍历时需注意边界情况,即首尾位置不能超出字符串的范围。最后计算子串长度,并与最长子串长度进行比较。返回时,使用c++字符串分割函数substr(),参数为最长子串的首位置与最长子串长度。
- 3 特殊讨论
当字符串长度很短(1或2)时可以直接解决。当字符串长度大于2时,为使较短回文子串至少可以向两侧遍历一次,循环中设置子串首位置需从1开始。因此,当字符串由连续多个相同字符组成时,如”ccc”,若不对下标为0的位置进行特殊讨论,会得到错误结果。特别地,若无法找到长度大于1的回文子串,返回第一个字符(字符串格式)即可。
2.3 具体代码
1 | class Solution { |
2.4 不足与收获
代码分类讨论较多,经一定改进可以减少讨论,使代码更简洁。
目前只有c++代码,日后有空可以补写python代码。
leetcode的输入输出与通常程序区别较大,本次进一步加深对leetcode输入输出的理解。
3 今后安排
使用markdown写一份leetcode题解的工作量不低于写一道新题,时间原因不可能每道题都发布题解。争取每日一题,每周2-3份题解吧。
最近开始学习b站古月居的ROS入门,根据学习情况随缘笔记吧。