【C++算法】62.字符串_最长回文子串
文章目录
- 题目链接:
- 题目描述:
- 解法
- C++ 算法代码:
题目链接:
5. 最长回文子串
题目描述:
解法
解法:中心扩展算法
奇数版:
偶数版:
C++ 算法代码:
class Solution
{
public:string longestPalindrome(string s) {// 中心扩展算法// 基本思路:从字符串的每个位置作为中心点开始,向两边扩展,寻找最长的回文子串int begin = 0; // 记录最长回文子串的起始位置int len = 0; // 记录最长回文子串的长度int n = s.size(); // 字符串总长度// 依次枚举字符串中的每个位置作为回文中心for(int i = 0; i < n; i++) {// 情况1:处理奇数长度的回文串(如"aba",中心是单个字符)int left = i, right = i; // 初始时,左右指针都指向当前位置i// 从中心向两边扩展,直到不满足回文条件或者到达边界while(left >= 0 && right < n && s[left] == s[right]){left--; // 左指针向左移动right++; // 右指针向右移动}// 循环结束时,left和right已经指向不满足回文条件的位置// 实际回文子串的范围是[left+1, right-1],长度为right-left-1if(right - left - 1 > len) // 如果找到更长的回文子串{begin = left + 1; // 更新起始位置len = right - left - 1; // 更新长度}// 情况2:处理偶数长度的回文串(如"abba",中心是两个字符之间的位置)left = i; // 左指针指向位置iright = i + 1; // 右指针指向位置i+1// 同样从中心向两边扩展while(left >= 0 && right < n && s[left] == s[right]){left--;right++;}// 同样检查是否找到更长的回文子串if(right - left - 1 > len){begin = left + 1;len = right - left - 1;}}// 返回最长回文子串,使用substr从原字符串中截取return s.substr(begin, len);}
};