下面是本人用C实现的曼彻斯特算法用来解决最长回文子串问题,提交时出现 Runtime Error。
然后就拿系统给的Last executed input作Testcase,却又成功算出来了,并且跟expected answer一样。
真是不知道问题出在哪?麻烦各位高手给看看,代码如下:
然后就拿系统给的Last executed input作Testcase,却又成功算出来了,并且跟expected answer一样。
真是不知道问题出在哪?麻烦各位高手给看看,代码如下:
char *expand(char *s) { int i, j, len = strlen(s); char *str = (char *)malloc(sizeof(char) * (2 * len + 2)); str[0] = "$"; str[1] = "#"; for(i = 0, j = 2; i < len; ++i) { str[j++] = s[i]; str[j++] = "#"; } str[j] = "\0"; return str; } char* longestPalindrome(char* s) { char *str = expand(s); int len = strlen(str), max = 0, k, i, j; int p[2002] = {1, 1}; int C = 1, R = 1; for(i = 2; i < len; ++i) { int i_mirror = C - (i - C); if(R - i > p[i_mirror]) p[i] = p[i_mirror]; else p[i] = R - i; while(str[i-p[i]-1] == str[i+p[i]+1]) p[i]++; C = i; R = i + p[i]; } for(i = 2; i < len; ++i) if(p[i] > max) { max = p[i]; k = i; } char *sp = (char *)malloc(sizeof(char) * (len / 2)); for(i = k - max + 1, j = 0; i < k + max; i += 2) sp[j++] = str[i]; sp[j] = "\0"; return sp; }
解决方案
10
假如字符串为空,那么将会malloc 0 大小内存,而这是一个未定义行为
5
边界条件
输入输出格式
……
输入输出格式
……
20
检查使用分配到的内存能否会越界
char *sp = (char *)malloc(sizeof(char) * (len / 2));
这句有没有考虑 len 为奇数的情况能否会越界
另外,动态分配的内存记得free是一个好的习惯