69,371
社区成员
发帖
与我相关
我的任务
分享
char* longestPalindrome(char* s) {
char *newStr = NULL;
char *newStrStart = NULL;
char *mvp = NULL;
char *mvq = NULL;
int *intAry = NULL;
int len = 0, maxlen = 0, pos = 1;
if(strlen(s) < 2)
return s;
/*set new str [aba] => [#a#b#a#] */
newStr = (char*)malloc(sizeof(char) * (strlen(s)*2 +2));
mvp = s;
mvq = newStr;
while(*mvp != '\0')
{
*mvq = '#';
*(mvq+1) = *mvp;
mvp++;
mvq = mvq + 2;
}
*mvq = '#';
*(mvq+1) = '\0';
/*cal len[i]*/
intAry = (int *)malloc(sizeof(int) * (strlen(s) * 2 + 1));
for(int i = 0 ; i <= (strlen(s) * 2 + 1); i++)
{
len = 1;
intAry[i] = 1;
mvp = newStr + i - 1;
mvq = newStr + i + 1;
if(mvp < newStr || mvq >= (newStr + strlen(newStr)))
{
continue;
}
while(*mvp == *mvq)
{
len+=1;
mvp--;
mvq++;
}
intAry[i] = len;
if(len > maxlen)
{
maxlen = len;
pos = i;
}
}
/*cal start pos*/
if(pos % 2 == 0)
{
newStrStart = s + pos/2 - maxlen/2;
}else
{
newStrStart = s + pos/2 - (maxlen/2 - 1);
}
free(newStr);
//free(intAry); 2.为什么这个free会出错
newStr = (char*)malloc(sizeof(char) * maxlen);
memcpy(newStr, newStrStart, maxlen - 1 );
newStr[maxlen-1] = '\0';
return newStr;
}
while(*mvp == *mvq)
{
len+=1;
mvp--;
mvq++;
}
这里越界了。我默认为越界他们取值会不等然后退出。没有考虑到同时越界的话取值会相等。
但是
intAry = (int *)malloc(sizeof(int) * (strlen(s) * 2 + 1));
for(int i = 0 ; i < (strlen(s) * 2 + 1); i++)
这个是没有越界的哦~
总而言之,多谢了。intAry = (int *)malloc(sizeof(int) * (strlen(s) * 2 + 2));
while(*mvp == *mvq)
{
len+=1;
mvp--;
mvq++;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* longestPalindrome(char* s) {
char *newStr = NULL;
char *newStrStart = NULL;
char *mvp = NULL;
char *mvq = NULL;
int *intAry = NULL;
int len = 0, maxlen = 0, pos = 1;
if(strlen(s) < 2)
return s;
/*set new str [aba] => [#a#b#a#] */
newStr = (char*)malloc(sizeof(char) * (strlen(s)*2 +2));
memset(newStr,0,sizeof(newStr));
mvp = s;
mvq = newStr;
while(*mvp != '\0')
{
*mvq = '#';
*(mvq+1) = *mvp;
mvp++;
mvq = mvq + 2;
}
*mvq = '#';
*(mvq+1) = '\0';
/*cal len[i]*/
intAry = (int *)malloc(sizeof(int) * (strlen(s) * 2 + 2));
memset(intAry,0,sizeof(intAry));
for(int i = 0 ; i < (strlen(s) * 2 + 2); i++)
{
len = 1;
intAry[i] = 1;
mvp = newStr + i - 1;
mvq = newStr + i + 1;
if(mvp < newStr || mvq >= (newStr + strlen(newStr)))
{
continue;
}
while( (*mvp == *mvq) &&(mvp - newStr >= 0))
{
len+=1;
mvp--;
mvq++;
}
intAry[i] = len;
if(len > maxlen)
{
maxlen = len;
pos = i;
}
}
/*cal start pos*/
if(pos % 2 == 0)
{
newStrStart = s + pos/2 - maxlen/2;
}else
{
newStrStart = s + pos/2 - (maxlen/2 - 1);
}
free(newStr);
free(intAry); //2.为什么这个free会出错
newStr = (char*)malloc(sizeof(char) * maxlen);
memcpy(newStr, newStrStart, maxlen - 1 );
newStr[maxlen-1] = '\0';
return newStr;
}
int main()
{
char str[] = "bb";
printf("%s\n",longestPalindrome(str));
return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* longestPalindrome(char* s) {
char *newStr = NULL;
char *newStrStart = NULL;
char *mvp = NULL;
char *mvq = NULL;
int *intAry = NULL;
int len = 0, maxlen = 0, pos = 1;
if(strlen(s) < 2)
return s;
/*set new str [aba] => [#a#b#a#] */
newStr = (char*)malloc(sizeof(char) * (strlen(s)*2 +2));
mvp = s;
mvq = newStr;
while(*mvp != '\0')
{
*mvq = '#';
*(mvq+1) = *mvp;
mvp++;
mvq = mvq + 2;
}
*mvq = '#';
*(mvq+1) = '\0';
/*cal len[i]*/
intAry = (int *)malloc(sizeof(int) * (strlen(s) * 2 + 1));
for(int i = 0 ; i < (strlen(s) * 2 + 1); i++)
{
len = 1;
intAry[i] = 1;
mvp = newStr + i - 1;
mvq = newStr + i + 1;
if(mvp < newStr || mvq >= (newStr + strlen(newStr)))
{
continue;
}
while(*mvp == *mvq)
{
len+=1;
mvp--;
mvq++;
}
intAry[i] = len;
if(len > maxlen)
{
maxlen = len;
pos = i;
}
}
/*cal start pos*/
if(pos % 2 == 0)
{
newStrStart = s + pos/2 - maxlen/2;
}else
{
newStrStart = s + pos/2 - (maxlen/2 - 1);
}
free(newStr);
free(intAry); //2.为什么这个free会出错
newStr = (char*)malloc(sizeof(char) * maxlen);
memcpy(newStr, newStrStart, maxlen - 1 );
newStr[maxlen-1] = '\0';
return newStr;
}
int main()
{
char str[] = "abcdabcba";
//char *res=longestPalindrome(str);
printf("%s\n",longestPalindrome(str));
return 0;
}