#include <stdio.h>
// 5. Longest Palindromic Substring
// Given a string S, find the longest palindromic substring in S.
// You may assume that the maximum length of S is 1000,
// and there exists one unique longest palindromic substring.
// https://leetcode.com/problems/longest-palindromic-substring/
// Algorithm:
// c a b a a
// c 1 0 0 0 0
// a 1 0 1 0
// b 1 0 0
// a 1 1
// a 1
// since 1~3 is longer than 3~4,
// longest palindromic substring is s[1~3], i.e., aba.
char* longestPalindrome(char* s) {
int debug = 0;
// int len = (sizeof(s) - 2) / sizeof(s[0]);
int len = 0;
while (s[len] != '\0') {
len++;
}
if (debug) printf("s = *%s*, len = %d\n", s, len);
int T[len][len];
int start = 0, end = 0;
for (int i = len - 1; i >= 0; i--) {
for (int j = len - 1; j >= i; j--) {
if (i == j) {
T[i][j] = 1;
} else if (s[i] == s[j]) {
if (i + 1 == j) {
T[i][j] = 1;
} else {
T[i][j] = T[i + 1][j - 1];
}
} else if (s[i] != s[j]) {
T[i][j] = 0;
}
if (T[i][j] == 1 && j - i >= end - start) {
start = i;
end = j;
}
if (debug) printf("i = %d, j = %d; start = %d, end = %d\n", i, j, start, end);
}
}
// char result[end - start + 1 + 1];
static char result[1000 + 1]; // 1 for '\0'
for (int i = 0; i <= end - start; i++) {
result[i] = s[i + start];
if (debug) printf("result[%d] = s[%d + %d] = s[%d] = %c\n", i, i, start, i + start, s[i + start]);
}
result[end - start + 1] = '\0'; // IMPORTANT
if (debug) printf("resut = *%s*\n", result);
// *** warning: address of stack memory
// associated with local variable 'result' returned
// result 是局部变量, 退出函数后会被释放, 所以在主函数中打印它会有不可预知后果.
// SOLUTION: result 改成静态,且分配 1000 + 1 个空间。
// TODO: 有没有办法不假设1000, 而是用 end - start + 1 + 1 ?
return result;
}
int main() {
char *str = longestPalindrome("cabaa");
printf("result = *%s*\n", str);
return 0;
}