关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

LeetCode 5.最长回文子串【JavaScript 5种思路实现】

发布时间:2023-06-26 21:00:45

题目描述


给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd" 输出: "bb"


题解


回文:指一个正读和反读都相同的字符串,例如,“aba” 是回文,而 “abc” 不是。


解决方案


思路一:暴力法


即通过双重遍历来获取目标字符串所有的子串,push 到一个数组里面,然后根据字符串长度排序,从最长字串开始循环校验,第一个为回文的子串就是我们要的结果

复杂度分析

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


因涉及一些执行语句,禁止写入,请联系客服获取


上面代码在目标字符串长度过大的时候,会超出时间限制,远远超出O(n^2) 的理想时间复杂度,这是因为过多的for 循环,js 自带函数使用过多造成的,优化一下


因涉及一些执行语句,禁止写入,请联系客服获取


看起来好多了,但是依然通不过Leecode 的测试,我觉得必须要把 slice split reverse join 这些函数都干掉才行,也可能 JS 语言效率确实慢一些


思路二:最长公共字串


反转 S,使之变成 S'。找到 S 和 S' 之间最长的公共子串,判断是否是回文

复杂度分析

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


因涉及一些执行语句,禁止写入,请联系客服获取


思路三:中心拓展


遍历一遍字符串,以每个字符为中心向两边判断,是否为回文字符串

复杂度分析

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


因涉及一些执行语句,禁止写入,请联系客服获取


思路四:动态规划


思路五:Manacher 算法


manacher 算法涉及中心拓展法、动态规划,是manacher 1975年发明出来用来解决最长回文子串的线性算法


因涉及一些执行语句,禁止写入,请联系客服获取


manacher 算法的工作,就是对上面代码中的辅助数组 p 进行优化,使时间复杂度的降到O(n^2)


因涉及一些执行语句,禁止写入,请联系客服获取



/template/Home/leiyu/PC/Static