求最长回文子串的长度
Leetcode: https://leetcode.com/problems/longest-palindromic-substring/
ACWing: https://www.acwing.com/problem/content/141/
解法:
- 暴力搜索+判断 O(n^3) — 显然不好
- O(n^2) 中心拓展,动态规划
- O(n) kmp算法
比较容易想的是中心扩展的方法,思路是:依次枚举N个点为回文子串的中心,然后从中心往两边拓展,找到以当前点为中心能得到的最大回文子串长度,最后取最大。
这个思路还需要解决一个奇偶问题(eg: aba, abba),常见的策略是在每两个字符中间插入一个没出现过的字符,比如‘#’,这样就可以把左右情况都转换为奇数的情况,减小代码实现难度。这也是解决奇偶问题常见的技巧。
这题还有个常见的错误解法:把当前串reverse之后去两个串的最长公共子串。反例:abcdba, abdcba。原数组最大回文子串的长度应该为1,按照上述方法求出来结果是2.
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int get_longest_palindromic(string s){
int len = s.size();
s.resize(2 * len + 1); // 重置string的长度
for (int i = 2 * len; i >= 0; i--){