中心点扩展法
首先确定回文串,就是找中心然后想两边扩散看是不是对称的就可以了。
- 一个元素可以作为中心点;
- 两个元素也可以作为中心点。
char* longestPalindrome(char* s) {
int len=strlen(s),i,left,right,start,maxlen=0;
for(i=0;i<len;i++)
{
// 情况1:中心是1个字母
left=i;
right=i;
while(left>=0 && right<len && s[left]==s[right])
{
if(maxlen<right-left+1)
{
maxlen=right-left+1;
start=left;
}
left--;
right++;
}
// 情况2:中心是2个字母
left=i;
right=i+1;
while(left>=0 && right<len && s[left]==s[right]) // 首先判断:中心2个字母是否相同
{
if(maxlen<right-left+1)
{
maxlen=right-left+1;
start=left;
}
left--;
right++;
}
}
// 在堆区分配内存,防止函数返回时空间被回收,导致字符串返回失败
char* result = (char*)malloc(maxlen + 1); // +1 for the null terminator
if (result == NULL) {
// Handle malloc failure
return NULL;
}
strncpy(result, s + start, maxlen);
result[maxlen] = '\0'; // Ensure null terminator
return result;
}