共计 1018 个字符,预计需要花费 3 分钟才能阅读完成。
一、暴力破解
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// 判断字符串是否是回文字符串
int isPalindromic(char *str, int start, int end)
{while (start < end)
{if (str[start] != str[end])
{return false;}
start++;
end--;
}
return true;
}
char *findLongestPalindromic(char *str)
{int len = strlen(str);
int k = 0;
if (len < 2)
{return str;}
// 回文字符串最小长度为 1,因为任何一个字符从左往右和从右往左读都是回文的
int maxLen = 1, startIndex = 0;
// 遍历所有长度 >= 2 的子串
for (int i = 0; i < len - 1; i++)
{for (int j = i + 1; j < len; j++)
{
// 当新的子串长度大于 maxLen 时,再判断是否回文
// 如果回文,则更新 maxLen,同时更新 startIndex
if (j - i + 1 > maxLen && isPalindromic(str, i, j))
{
maxLen = j - i + 1;
startIndex = i;
}
}
}
// 调配存储空间,存储新字符串并返回
// 调配的时候要多调配一个空间用来存储空字符 '\0'
char *palindromic = (char *)malloc((maxLen + 1) * sizeof(char));
for (int i = 0; i < maxLen; i++)
{palindromic[i] = str[startIndex + i];
}
palindromic[maxLen] = '\0';
return palindromic;
}
int main(void)
{
int i = 0;
char str[] = "babad";
char *palind = NULL;
palind = findLongestPalindromic(str);
while (palind[i] != '\0')
{printf("%c", palind[i]);
i++;
}
}
执行用时:304 ms, 在所有 C 提交中击败了 26.13% 的用户
内存耗费:5.9 MB, 在所有 C 提交中击败了 79.53% 的用户
工夫复杂度 O(n3),空间复杂度 O(n)。
这种办法只会返回一种解,即可能有多个最长回文串,此办法只返回最先遍历到的。
正文完