题目描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
示例1
输入
"abc1234321ab",12
返回值
7
解题思路:
求以n结尾的最长的回文字符串,以current_start开始,以current_stop = n结束。
则以n+1结尾的最长的子字符串要么是在此基础上向前扩展一个字符的,
current_start--;
current_stop = n + 1;
要么是从第current_start开始,寻找最大的回文字符串。
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
int getLongestPalindrome(string A, int n) {
// write code here
if (n < 2)
{
return n;
}
int current_start = 0;
int current_stop = 0;
int max_len = 1;
int current_len = 1;
for (int i = 1; i < n; i++)
{
current_stop = i;
if (current_start > 0 && A[i] == A[current_start - 1])
{
current_start--;
}
else
{
for (int j = current_start; j <= i; j++)
{
bool isPalindrome = 1;
for(int k = j; k <= (j + i) / 2; k++)
{
if (A[k] != A[i - k + j])
{
isPalindrome = 0;
break;
}
}
if (isPalindrome)
{
current_start = j;
break;
}
}
}
current_len = current_stop - current_start + 1;
max_len = current_len > max_len ? current_len : max_len;
}
return max_len;
}
};
改进:
回文字符串的首末字符相同,使用find来优化。
class Solution {
public:
int getLongestPalindrome(string A, int n) {
// write code here
if (n < 2)
{
return n;
}
int current_start = 0;
int current_stop = 0;
int max_len = 1;
int current_len = 1;
for (int i = 1; i < n; i++)
{
current_stop = i;
if (current_start > 0 && A[i] == A[current_start - 1])
{
current_start--;
}
else
{
int j = A.find(A[i], current_start);
while (j <= i)
{
bool isPalindrome = 1;
for (int k = j; k <= (j + i) / 2; k++)
{
if (A[k] != A[i - k + j])
{
isPalindrome = 0;
break;
}
}
if (isPalindrome)
{
current_start = j;
break;
}
j = A.find(A[i], ++j);
}
}
current_len = current_stop - current_start + 1;
max_len = current_len > max_len ? current_len : max_len;
}
return max_len;
}
};