2024-03-19 02:45:09 +08:00

136 lines
3.6 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
/**
* 最长回文子串
* https://leetcode-cn.com/problems/longest-palindromic-substring/description/
*/
/**
* 看网上的Manacher算法
*/
char *longestPalindrome(char *s)
{
if (strlen(s) <= 1)
{
return s;
}
char new_s[2010] = {0};
int p[2010] = {0};
// memset(p, 0, sizeof(int) * (strlen(s) * 2 + 1)); //创建p
// memset(new_s, 0, strlen(s) * 2 + 1); //构建一个新的字符串
//给字符串填充#分割
int len = strlen(s);
for (int i = 0; i < len; i++)
{
new_s[i * 2] = '#';
new_s[(i * 2) + 1] = s[i];
}
new_s[len * 2] = '#';
p[0] = 1;
int id = 0, mx = 0, max_pos = 0, max_len = 0;
for (int i = 1; i < strlen(new_s); i++)
{
if (i < mx)
{
p[i] = p[2 * id - i] > mx - i ? mx - i : p[2 * id - i];
}
else
{
p[i] = 1;
}
while (i - p[i] >= 0 && new_s[i - p[i]] == new_s[i + p[i]])
{
p[i]++;
}
if (mx < i + p[i])
{
id = i;
mx = i + p[i];
}
if (max_len < p[i] - 1)
{
max_pos = i;
max_len = p[i] - 1;
}
}
char *ret = malloc(max_len + 1); //返回的字符串
memset(ret, 0, max_len);
int pos = max_pos / 2 + max_pos % 2 - max_len / 2 - max_len % 2;
memcpy(ret, &s[pos], max_len);
return ret;
}
/*
char* longestPalindrome(char* s) {
int max = 1, len;
int left, right;
int maxLeft = 0;
int totalLen = strlen(s);
int i,j;
char *res = (char *) calloc(1, 1001);
if(totalLen == 1) {
res[0] = s[0];
return res;
}
for(i = 0; i < totalLen - 1; /*i++) {
if(totalLen-i<=max/2)
break;
//first, pass consecutive numbers equal to each other
right = i;
left = i;
while((right < totalLen - 1) && (s[right] == s[right + 1])) {
right ++;
}
//second, set i = r + 1, for there is no len larger when start from i to r
i = right + 1;
//third, count those s[right] == s[left]
while((left > 0) && (right < totalLen - 1) && (s[left - 1] == s[right + 1])) {
right++;
left--;
}
if(right - left + 1 > max) {
maxLeft = left;
max = right - left + 1;
}
}
strncpy(res, s + maxLeft, max);
return res;
}
*/
void print_r_c(char *a, int len)
{
for (int i = 0; i < len; i++)
{
printf("%c\t", a[i]);
}
printf("\n");
}
void print_r(int *a, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
}
int main()
{
printf("%s\n", longestPalindrome("caba"));
printf("%s\n", longestPalindrome("dddddddd"));
printf("%s\n", longestPalindrome("aca"));
printf("%s\n", longestPalindrome("feef"));
printf("%s\n", longestPalindrome("abcba"));
printf("%s\n", longestPalindrome("daomdukomcayjwgmmetypncdeixarhbectjcwftjjtwjrctixtrsehegwlfotpljeeqhntacfihecdjysgfmxxbjfeskvvfqdoedfxriujnoeteleftsjgdsagqvcgcdjbxgmguunhbjxyajutohgbdwqtjghdftpvidkbftqbpeahxbfyamonazvubzirhqseetaneptnpjbtrtitttxsyjckjvwtrmuwgidkofvobrwrffzrpnxbectsydbvswstfiqranjzhsebjnmprjoirqkgttahrivkcjtitdcpohwwerwgrdivqbltfnigavydxpmitttjjzyrmpaptkczzgnsovebvxezkkovgqegctxacvjfqwtiycnhartzczcgosiquhmdbljjzyrnmffcwnkyzytnsvyzayrieqyrfpxintbbiyrawxlguzaisedwabpzvevlejadztuclcpwvonehkhknicdksdcnjfaoeaqhcdkdtywilwewadcnaprcasccdcnvdgjdqirrsqwzhqqorlhbgpelpupdvuynzybcqkffnnpocidkkigimsa"));
getchar();
return 0;
}