int expandAroundCenter(const char* s, int left, int right) {
while (left >= 0 && right < strlen(s) && s[left] == s[right]) {
left--;
right++;
}
return right - left - 1; // 返回回文长度
}
char* longestPalindrome(char* s) {
int start = 0, maxLen = 0;
int len = strlen(s);
for (int i = 0; i < len; i++) {
// 以单个字符为中心扩展(回文长度为奇数)
int len1 = expandAroundCenter(s, i, i);
// 以两个字符之间为中心扩展(回文长度为偶数)
int len2 = expandAroundCenter(s, i, i + 1);
int curMaxLen = len1 > len2 ? len1 : len2;
// 更新最长回文的起始位置和长度
if (curMaxLen > maxLen) {
maxLen = curMaxLen;
start = i - (curMaxLen - 1) / 2;
}
}
// 截取最长的回文子串
static char result[1000]; // 假设结果长度不超过1000
strncpy(result, s + start, maxLen);
result[maxLen] = '\0';
return result;
}
总结:
该方案选定一个点,从中心点像两边延申,找到最长回文字串后使用 strncpy(result, s + start, maxLen);函数从中复制出字符串,最后使用 result[maxLen] = ‘\0’;表示字符串的截至,通常\0表示字符串的截至,而strncpy没有。
回文分为奇偶,因此要分两种情况,比较其长度。