计算其中最长回文子串的长度
题目来自网络搜集和常考算法,如有侵权请联系我
题目描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
测试样例:
"abc1234321ab",12
返回:7
C++
class Palindrome {
public:
int getLongestPalindrome(string A, int n) {
// write code here
int right = 0;
int left = 0;
int maxLen = 0;
for(int i=0;i<n;i++){
right = i;
left = i;
while(left>=0&&right<n&&A[right]==A[left]){
++right;
--left;
}
maxLen = max(maxLen,right-left-1);
left = i;
right = i+1;
while(left>=0&&right<n&&A[right]==A[left]){
++right;
--left;
}
maxLen = max(maxLen,right-left-1);
}
return maxLen;
}
};
C语言
char* longestPalindrome(char* s)
{
int len = strlen(s);
if (len <= 1) { return s; }
//定义bool类型的dp,只能为true或false
bool dp[1001][1001];
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for (int i = 1; i < len; i++)
{
dp[i][i] = true;
//一定不要忽略,在下面k=2会用到
dp[i][i - 1] = true;
}
int left = 0;
int right = 0;
int max = 0;
//k表示回文子串的长度
for (int k = 2; k <= len; k++)
{
//i表示回文子串的起始位置
for (int i = 0; i < len - k + 1; i++)
{
if (s[i] == s[k - 1 + i] && dp[i + 1][k + i - 2])
{
dp[i][k - 1 + i] = true;
if (max < k - 1)
{
max = k - 1;
left = i;
right = k - 1 + i;
}
}
}
}
char *arr = (char *)malloc(sizeof(int) * (max * 2));
int i = 0;
for (; i <= max; i++)
{
arr[i] = s[left++];
}
arr[i] = ' ';
return arr;
}