给你一个字符串STR,找到STR中最长的回文子串,使用C++语言
时间: 2024-09-15 21:15:14 浏览: 55
C语言求两个字符串的最长公共子串
在C++中,寻找给定字符串`STR`中最长的回文子串,一种常见的动态规划解决方案是使用Manacher's Algorithm。这个算法利用了回文串的对称性质,可以在O(n)的时间复杂度内找到最长回文子串。以下是基本的步骤:
```cpp
#include <string>
#include <vector>
std::string longestPalindrome(std::string s) {
if (s.empty()) return "";
int n = s.size();
// 创建一个新的字符串,插入特殊字符 '#' ,便于处理边界情况
std::string t = '#', prefix;
for (char c : s) {
t += c;
prefix = c + prefix;
}
// 定义两个变量P[0] 和 C[0]
std::vector<int> P(n), C(n);
int center = 0, right = 0;
for (int i = 1; i < n; ++i) {
// 如果当前位置在右边界内,则取P[i-C[i]]作为初始值
int mirror = 2 * center - i;
if (i <= right) {
P[i] = std::min(right - i, P[mirror]);
}
while (i + P[i] < n && i - P[i] >= 0 && t[i + P[i]] == t[i - P[i]]) {
P[i]++;
}
// 更新右边界
if (i + P[i] > right) {
center = i;
right = i + P[i];
}
}
// 最长回文子串的起始位置为最右边的奇数索引对应的字符串位置
int maxLen = P[0], maxStart = 0;
for (int i = 1; i < n; ++i) {
if (P[i] > maxLen) {
maxLen = P[i];
maxStart = i;
}
}
// 从原始字符串S中提取最长回文子串
std::string ans = prefix.substr(maxStart - maxLen, maxLen);
return ans;
}
```
在这个函数中,`P[i]`表示到原字符串结束点为止,以`i`为中心的最长回文子串长度。当遍历整个字符串时,不断更新中心和右边界的位置,同时更新最长回文子串的信息。
阅读全文