OJ 上的题就是参考这里的方法。回文字符串也是经常出现的题目。
一、题目
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000
。
示例 1:
1 |
|
示例 2:
1 |
|
二、思路
中心扩展法
回文中心两侧互为镜像。因此可以从它的中心展开,并且只有 2n-1 个这样的中心。
为什么是 2n-1 个?因为回文中的中心字符串长度可能有两种:奇数与偶数。例如:
- ada :只有 d 这一个
- adda:有 dd 这两个
有人指出:addda 这三个 ddd 呢?实质上,这其实就是中间只有一个 d 的奇数个。之后,就在中间这个 d 或者 dd 为中心,向两边扫描找出相同的字符。由此找到回文字符串。
start = i- (mlen - 1) / 2; // 回文字符串开始字符的索引值
end = i + mlen / 2; // 回文字符串结束字符的索引值
len = max(max(len1, len2), len); // 最长回文字符串的长度
三、代码实现
1 |
|
复杂度:
- 时间复杂度: O(n^2)
- 空间复杂度: O(1)