class Solution {
public:
string longestPalindrome(string s) {
if(s.empty() || s.size() < 2) {
return s;
}
//对原始字符串做处理,将abc变成#a#b#c#
string tmp = "#";
for(char c : s) {
tmp += c;
tmp += "#";
}
tmp += "#";
int n = tmp.size();
int start = 0;
int maxLen = 0;
//从左到右遍历处理过的字符串,求每个字符的回文半径
for(int i = 0; i < n; ++i) {
//计算当前以i 为中心的回文半径
int cur = expand(tmp, i, i);
//如果当前计算的半径大于maxLen,就更新start(原始字符的起始位置)
if(cur > maxLen) {
//i:当前遍历到的数组下标
//armLen:以i为中心,计算出的回文半径
start = (i - cur) / 2;
maxLen = cur;
}
}
//根据start和maxLen,从原始字符串中截取一段返回
return s.substr(start, maxLen);
}
private:
//以left和right为起点,计算回文半径,由于while循环退出后left和right各多走了一步
//所以在返回的总长度时要减去2
int expand(string s, int left, int right) {
while(left >= 0 && right < s.size() && s[left] == s[right]) {
--left;
++right;
}
return (right - left - 2) / 2;
}
};
最长回文子串
最新推荐文章于 2024-10-04 20:45:38 发布