给你一个字符串 s,找到 s 中最长的回文子串。
算法思想:
-
第一步:找到主串的所有子串。
-
第二步:判断子串是否是回文串(子串是奇数串,如果从最中间开始,左边第一个等于右边第一个,以此类推,最后子串最左边和最右边相等,则为回文串,记录此时回文串的长度,并记录回文串的起始位置。子串如果是偶数串,最中间的两个相等...为回文串,记录此时回文串的长度,并记录回文串的起始位置)。
-
第三步:判断当前子回文串的长度是否大于之前的最大回文串长度,如果大于,则最大回文串长度改为当前子回文串长度,起始位置改为当前子回文串的起始位置。
-
第四步:最后返回最长回文串。
char * longestPalindrome(char * s){
int i = 0;
int k = 0;
int len = strlen(s);
int maxSize = 0;
int pos = 0;
char *str;
str = (char*)malloc(2000);
char res[1000] = {""};
for ( i = 0; i < len; i++)
{
for ( k = i; k < len; k++)
{
if ((k - i + 1) <= maxSize) continue;
if ((k-i+1) % 2 == 0) {
int j = 0;
int chileLen = k-i+1;
while (j <= chileLen / 2 - 1 && s[chileLen / 2 - j - 1 + i] == s[chileLen / 2 + j + i]) //caab
{
j++;
}
if (j == chileLen /2 && 2*j > maxSize) {
maxSize = 2 * j;
pos = i;
}
} else {
int j = 0;
int chileLen = k - i + 1;
while (j <= chileLen / 2 - 1 && s[chileLen / 2 - j - 1 + i] == s[chileLen / 2 + j + 1 + i]) // aba
{
j++;
}
if (j == chileLen / 2 && 2*j + 1 > maxSize) {
maxSize = 2 * j + 1;
pos = i;
}
}
}
}
strncpy(res, s+pos, maxSize);
strcpy(str, res);
return str;
}