代码目的:找到字符串s中,最长的唯一回文字符串。
我写的代码能在dev c++中运行并找到正确结果,可是提交到leetcode中,显示runtime error,并显示“bb”无法识别。dev c++中测试可以识别。
另外用vs2012编译运行,会报错“已触发了一个断点。”检测发现在free()函数之后的语句无法正常执行。请问问题在哪里?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* longestPalindrome(char* s);
int main()
{
char s[] = "bb";
char *longs;
longs = longestPalindrome( s );
printf("%s length = %d\n", longs, strlen(longs));
return 0;
}
char* longestPalindrome(char* s)
{
int i, j, cnt=0, k;
char *ts, *ns; //用于保存回文的指针
if( strlen(s) == 1 ) //当字符串长度为1时,直接返回
return s;
/*对称位置比较,找以s[0]为开头的回文字符串,最长为整个字符串,最短为s[0]本身。*/
for( i=0, j=strlen(s)-1; i<=j; i++, j--){
//i表示s的首字符下标,j表示s的尾字符下标
if( s[i] == s[j] ){ //s[i]与s[j]相等时,分三种情况
if( i == j ){ //第一种,i=j,即搜索到回奇数长度的文字符串的中间字符
ns = (char*)malloc((i*2+2)*sizeof(char));
for( k=0; k<i*2+1; k++) //申请内存,保存该字符串到ns
ns[k] = s[k];
ns[k] = '\0';
ts = longestPalindrome(++s); //以s字符串第二个字符为首,递归调用,把返回的字符串赋给指针ts
break;
}
else if( i+1 == j ){ //第二种,i=j,即搜索到回偶数长度的文字符串的中间两个字符
ns = (char*)malloc((j*2+1)*sizeof(char));
for( k=0; k<j*2; k++)
ns[k] = s[k];
ns[k] = '\0';
ts = longestPalindrome(++s);
break;
}
else //第三中,单纯的对称位置字符相同
continue;
}
else{ //当s[i]不等于s[j],即对称位置字符不同
cnt++;
i = -1; //i在这次循环结束后,会执行i++,则i=0
j = strlen(s) - cnt; //j从末尾依次往前推
}
}
if( strlen(ns) < strlen(ts) ){ //比较字符串ns和返回字符串ts的长度,返回长度大的字符串
free(ns);
return ts;
}
else{
free(ts);
return ns;
}
}