感觉从动态规划出发的解法稍显复杂,提供一个较为简单的中心扩散法。
分析回文子串的特征可以发现,回文子串无非分为两种:①以第i个字符为中心的回文子串,该子串长度为奇数;②以第i个“空隙”为中心的回文子串,该子串长度为偶数。
可能作为中心的字符有n个,可能作为中心的“空隙”则有n-1个。
因此,从前向后遍历,针对每一个字符或空隙,以它为中心向两端进行扩散,寻找最长的回文子串即可。
C++代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int max_len = 0;
int max_start = 0;
for (int i = 0; i < s.length(); i++) {
// 以i为中心的回文子串 --- 奇数长度
int j = 0;
while(i-j >= 0 && i+j < s.length() && s[i-j] == s[i+j]) {
j += 1;
}
j -= 1;
int cur_len = 2*j+1;
if (cur_len > max_len) {
max_len = cur_len;
max_start = i - j;
}
// 偶数长度 --- 从i-1个“空隙”往两边探索
if (i != 0) {
int j = 0;
while (i-j-1 >= 0 && i+j < s.length() && s[i-j-1] == s[i+j]) {
j += 1;
}
int cur_len = 2 * j;
if (cur_len > max_len) {
max_len = cur_len;
max_start = i - j;
}
}
}
return s.substr(max_start, max_len);
}
};
力扣运行结果:
希望可以有所帮助鸭!加油ヾ(◍°∇°◍)ノ゙