这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
一、写在前面
LeetCode 第一题两数之和传输门:听说你还在写双层for循环解两数之和?
LeetCode 第二题两数之和传输门:# 两个排序数组的中位数,“最”有技术含量的解法!
今天给大家分享的是LeetCode 数组与字符串 第三题:最长回文子串,为面试而生,期待你的加入。
二、今日题目
给定一个字符串 s,找到 s 中最长的回文子串。
你可以假设 s 的最大长度为1000。
示例:
1 | python复制代码示例 1: |
三、 分析
这个题目呢,之前参加校IT精英赛时遇到过,当时用c写的,呃···可惜,没写出来,所以咋看第一眼,有点心凉的感觉,当然今日之我已非彼时,早已深知回文字符是个啥玩意,比如日期:2018102,就是个回文字符串。
我是这样想的,要找字符串中最长的回文字符串,肯定就要先找出这个字符串的子串中那些是回文串,然后再求他们中最长的,就可以找到答案了,理清思路,我就开始兴奋的敲代码了,然而…
四、解题
- 方法一:
根据上面的思路,一步步来,时间复杂度,嗯,好像有O(n^4)…
1 | python复制代码class Solution: |
- 提交结果:
提交之后,老半天,给出结果,运行超时(hhh,结果是对的,就是时间上还有待优化)
- 方法二:
对于方法一,无话可说,思前想后,没个结果,百度,嗯,百度是个好东西。
从从中心向外扩散,时间复杂度:O(n^2)
1 | python复制代码''' |
- 提交结果
测试数据:103组
运行时间:1256ms
击败人百分比:61.95%
- 方法三:
Manacher算法
时间复杂度:O(n)
算法只有遇到还没匹配的位置时才进行匹配,已经匹配过的位置不再进行匹配,因此大大的减少了重复匹配的步骤,对于S_new中的每个字符只进行一次匹配。所以该算法的时间复杂度为O(2n+1)—>O(n)(n为原字符串的长度),所以其时间复杂度依旧是线性的。
1 | python复制代码class Solution: |
- 提交结果
测试数据:103组
运行时间:232ms
击败人百分比:72.36%
五、结语
坚持 and 努力 : 终有所获。
思想很复杂,
实现很有趣,
只要不放弃,
终有成名日。
—《老表打油诗》
下期见,我是爱猫爱技术的老表,如果觉得本文对你学习有所帮助,欢迎点赞、评论、关注我!
本文转载自: 掘金