题解 | 最长回文子串
最长回文子串
https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af
#include <algorithm>
#include <string>
using namespace std;
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param A string字符串
* @return int整型
*/
int getLongestPalindrome(string A) {
int n = A.size();
if (n == 0) return 0;
int maxLen = 1; // 最长回文子串的长度,至少为 1
// 中心扩展函数
// 先找到位置为i的一个字母或者位置为i,i+1的两个字母,假设有两个箭头,开始指向该字母或者分别指向两个字母。如果选择一个字母,其本身回文,然后每次向两边各走一步,看当前箭头指向的两个字母是否相同,相同则这两个字母也是回文中的一部分,直到不相等时返回奇数回文长度;若是两个字母,则需看两者是否相等,不相等返回0,如相等和选择单个字母时一样,进行一次两边各走一步的操作,最后可以得到偶数会问长度
auto expandAroundCenter = [&](int left, int right) {
while (left >= 0 && right < n && A[left] == A[right]) {
left--;
right++;
}
return right - left - 1; // 返回当前回文子串的长度
};
for (int i = 0; i < n; i++) {
// 奇数长度的回文子串
int len1 = expandAroundCenter(i, i);
// 偶数长度的回文子串
int len2 = expandAroundCenter(i, i + 1);
// 更新最大长度
// 每一次更新i,都从i找奇数回文子串的长度和偶数回文子串的长度,最后用max(len1, len2)得出更大的一个,再与之前的maxLen做对比
maxLen = max(maxLen, max(len1, len2));
}
return maxLen;
}
};