最长回文子串(动态规划)
给定一个串,求它的子串中是回文串且最长的子串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * longestPalindrome(char * s){
int length = 0;
char * sptr = s;
while (* sptr != '\0'){
length++;
sptr++;
}
int left = 0, right = 0;
// int paliArray[length][length];
// memset((void *)paliArray, 0, length * length);
int (*paliArray)[length];
paliArray = (int (*)[length])calloc(sizeof(int *) * length, length);
for (int k = 0; k < length; k++){
for (int i = 0; i < length - k; i++){
int j = i + k;
if (i == j){
paliArray[i][j] = 1;
}else{
if (s[i] == s[j]){
if (j - i == 1){
paliArray[i][j] = 1;
}else{
paliArray[i][j] = paliArray[i + 1][j - 1];
}
}else{
paliArray[i][j] = 0;
}
}
if (paliArray[i][j] == 1){
if (j - i + 1 > right - left){
left = i, right = j;
}
}
}
}
char * construct_str = (char *)malloc(sizeof(char) * (right - left + 2));
char * pconstr = construct_str;
while (left <= right){
*pconstr = s[left++];
pconstr++;
}
return construct_str;
}
int main(){
char * s1 = (char *)"babad";
char * s2 = (char *)"cbbd";
char * s3 = (char *)"a";
printf("%s\n", longestPalindrome(s1));
printf("%s\n", longestPalindrome(s2));
printf("%s\n", longestPalindrome(s3));
return 0;
}