一、暴力破解
#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)。
这种办法只会返回一种解,即可能有多个最长回文串,此办法只返回最先遍历到的。