题目 |
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
给定一个字符串s,找到s中最长的回文子字符串。你可以假定最大长度是1000
知识点 |
回文字符串:一个字符串,从左到右读和从右到左读是完全一样的,比如level,abba等
思路 |
感觉这一题还是挺难的,没有什么想法,所以直接看了一些大牛的博客,整理出来四种解决方案
第一种:蛮力穷举法,时间O(n^3) 空间O(1)
穷举所有子字符串,依次按位判断是否是回文,并更新结果,时间复杂度很高,空间复杂度很低
第二种:动态规划,时间复杂度O(n^3) 空间O(1)
根据回文的特性,一个大的回文,按比例虽小后的字符串也必定是回文,比如BCCB,那么CC肯定也是回文,什么问题可以使用动态规划来解决?1. 大问题拆解为小问题,两个问题解决的事情是一样的,2. 重复利用之前的计算结果
第三种:中心扩散法 ,时间复杂度O(n^3) 空间O(1)
穷举所有的中心点,以中心点向两边扩散来找出最大的字符串,一共有2n-1个中心,为什么不是n个呢?因为偶数个的时候中心就是两个字符,如果abbba,那么中心点分别就是(a,b,b,b,a,ab,bb,bb,ba)
第四种:马拉车算法 Manacher Algorithm 时间复杂度 O(n) 空间 O(n)
Manacher算法是非常经典的计算连续下标回文的算法。它利用了回文的对称性,更具体的来说,是回文内回文的对称性,来解决这个问题。
代码实现 |