最长回文子串

来源:互联网 发布:ajax获取数据 编辑:程序博客网 时间:2024/05/22 03:42
题目:http://hihocoder.com/problemset/problem/1032

样例输入     样例输出
3abababa       7aaaabaa       5acacdas       3


方法一:动态规划

/** * Longest Palindrome Substring * Dynamical Programming(DP) * time: o(n^2) * memory: o(n^2) */#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_SIZE 1000int f[MAX_SIZE][MAX_SIZE];int main(){int i, j, k, n, str_len, max_len;char str[MAX_SIZE+5];scanf("%d", &n);for (i = 0; i < n; i++){scanf("%s", str);str_len = strlen(str);memset(f, 0, sizeof(f));max_len = 0;for (j = 0; j < str_len; j++){f[j][j] = 1;}for (k = 1; k <= str_len - 1; k++){for (j = 0; j + k < str_len; j++){if ((j + 1 > j + k - 1) && (str[j] == str[j+k]))f[j][j+k] = 1;else if ((f[j+1][j+k-1] == 1) && (str[j] == str[j+k]))f[j][j+k] = 1;if ((f[j][j+k] == 1) && (max_len < k))max_len = k;}}printf("%d\n", max_len+1);}return 0;}


方法二:中心展开法

/** * Longest Palindrome Substring * Increament from center * time: o(n^2) * memory: o(n) */#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_SIZE 1000000int main(){int i, j, k, n, str_len, max_len;char str[MAX_SIZE+5];scanf("%d", &n);for (i = 0; i < n; i++){scanf("%s", str);str_len = strlen(str);max_len = 0;//center at str[j]for (j = 0; j < str_len; j++){for (k = 0; (j-k>=0) && (j+k<str_len) && (str[j-k]==str[j+k]); k++);if (max_len < 2 * (k-1) + 1)max_len = 2 * (k-1) + 1;}//center at str[j,j+1]for (j = 0; j+1 < str_len; j++){for (k = 0; (j-k>=0) && (j+1+k<str_len) && (str[j-k]==str[j+1+k]); k++);if (max_len < 2 * (k-1) + 2)max_len = 2 * (k-1) + 2;}printf("%d\n", max_len);}return 0;}


方法三:Manacher算法


/** * Longest Palindrome Substring * Manacher Algorithm * time: o(n) * memory: o(n) */#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_SIZE 1000005char raw_str[MAX_SIZE];char new_str[2*MAX_SIZE];int  len[2*MAX_SIZE];int main(){int i, j, n, str_len, new_len, max_center, max_last, max_len;scanf("%d", &n);for (i = 0; i < n; i++){scanf("%s", raw_str);str_len    = strlen(raw_str);new_str[0] = '$';for (j = 0; j < str_len; j++){new_str[2*j+1] = '#';new_str[2*j+2] = raw_str[j];}new_str[2*j+1] = '#';new_str[2*j+2] = '@';new_str[2*j+3] = 0;new_len        = 2 * str_len + 1;max_center = max_last = max_len = 0;len[0] = 0;for (j = 1; j <= new_len; j++){ if (max_last > j) { if (len[2*max_center-j] > (max_last - j + 1)) len[j] = max_last - j + 1; else len[j] = len[2*max_center-j]; } else len[j] = 1;for (; new_str[j-len[j]] == new_str[j+len[j]]; len[j]++); if (len[j] > len[max_center]) { max_center = j; max_last = j + len[j] - 1; } if (max_len < max_last - max_center) max_len = max_last - max_center;}printf("%d\n", max_len);}return 0;}



参考:
http://www.sjsjw.com/kf_code/article/033089ABA014616.asp
http://blog.csdn.net/winddreams/article/details/44218713
http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/
http://www.open-open.com/lib/view/open1419150233417.html


0 0