算法题OJ说Segmentation fault:段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域
题目描述当你在百度上输入搜索内容时,如果你一不小心输错了,百度会给你一些提醒。现在我们来实现一个简化的版本。当你输入一个字符串时,如果这个字符串不存在,但是只交换其中的相...
题目描述
当你在百度上输入搜索内容时,如果你一不小心输错了,百度会给你一些提醒。现在我们来实现一个简化的版本。
当你输入一个字符串时,如果这个字符串不存在,但是只交换其中的相邻的两个字母时(只允许交换一次),可以找到一个或多个单词,那么请输出这些单词。例:
给定一个字典,里面仅有ABDC,ACBD,两个单词,现在输入单词ABCD,按从左到右的顺序交换可以产生BACD,ACBD,ABDC,三种组合,但是只有ACBD,ABDC在字典中,所以应该输出ACBD,ABDC,每行一个单词,顺序是按由左到右的交换顺序。如果输入单词ACBD,字典中有这个单词,所以只需输出ACBD。如果输入BACD,只交换一次相邻的字母是不能产生字典中的单词的,所以请不要输出任何信息。
输入
该题只有一组数据。
第一行一个数n。字典中有n个单词。n<=10000
下面n行,每行一个单词,单词长度不超过10;
接下来一行是一个数m,表示一共输入了m个单词
下面m行,每行一个单词,单词长度不超过10;
单词都仅有大写英文字母
输出
对于每个输入,如果字典中有这个单词,请输出这个单词并换行。
如果字典中没有这个单词,就搜索仅交换其中相邻的两个字母之后是否可以产生字典中的单词。如果有多个,请按由左到右的交换顺序输出这些单词,每行一个。如果没有的话,什么也不要输出
//////////////////////////////////////////////////////////////////////////////////
以下是代码,麻烦帮忙看下哪里越界了吗?
/////////////////////////////////////////////////////////////////////////////////
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#define N 100
int main()
{
int i,j,n,m,find=0;
char a[N+5][20]= {0},b[N+5];
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%s",a[i]);//数组a表示字典中有的单词
}
scanf("%d",&m);
for(i=0; i<m; i++)
{
find=0;
scanf("%s",b);//b是待判定单词
for(j=0; j<n; j++)
{
if(strcmp(b,a[j])==0)
{
printf("%s\n",b);//如果有,直接输出
find=1;
break;
}
}
if(!find)
{
int len=strlen(b);
for(int t=0; t<len-1; t++)//从第一个开始依次尝试交换相邻字母后是否符合
{
char c[N+5],temp;
strcpy(c,b);
temp=c[t],c[t]=c[t+1],c[t+1]=temp;
for(int k=0; k<n; k++)
{
if(!strcmp(c,a[k]))
{
printf("%s\n",c);//如果交换字母后相同,输出并跳出循环。
break;
}
}
}
}
}
return 0;
}
//////////////////////////////////////////////////////////
测试用例
//////////////////////////////////////////////////
样例输入
3
ABCD
ACBD
BADC
3
ACBD
ABDC
BBDD
样例输出
ACBD
BADC
ABCD 展开
当你在百度上输入搜索内容时,如果你一不小心输错了,百度会给你一些提醒。现在我们来实现一个简化的版本。
当你输入一个字符串时,如果这个字符串不存在,但是只交换其中的相邻的两个字母时(只允许交换一次),可以找到一个或多个单词,那么请输出这些单词。例:
给定一个字典,里面仅有ABDC,ACBD,两个单词,现在输入单词ABCD,按从左到右的顺序交换可以产生BACD,ACBD,ABDC,三种组合,但是只有ACBD,ABDC在字典中,所以应该输出ACBD,ABDC,每行一个单词,顺序是按由左到右的交换顺序。如果输入单词ACBD,字典中有这个单词,所以只需输出ACBD。如果输入BACD,只交换一次相邻的字母是不能产生字典中的单词的,所以请不要输出任何信息。
输入
该题只有一组数据。
第一行一个数n。字典中有n个单词。n<=10000
下面n行,每行一个单词,单词长度不超过10;
接下来一行是一个数m,表示一共输入了m个单词
下面m行,每行一个单词,单词长度不超过10;
单词都仅有大写英文字母
输出
对于每个输入,如果字典中有这个单词,请输出这个单词并换行。
如果字典中没有这个单词,就搜索仅交换其中相邻的两个字母之后是否可以产生字典中的单词。如果有多个,请按由左到右的交换顺序输出这些单词,每行一个。如果没有的话,什么也不要输出
//////////////////////////////////////////////////////////////////////////////////
以下是代码,麻烦帮忙看下哪里越界了吗?
/////////////////////////////////////////////////////////////////////////////////
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#define N 100
int main()
{
int i,j,n,m,find=0;
char a[N+5][20]= {0},b[N+5];
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%s",a[i]);//数组a表示字典中有的单词
}
scanf("%d",&m);
for(i=0; i<m; i++)
{
find=0;
scanf("%s",b);//b是待判定单词
for(j=0; j<n; j++)
{
if(strcmp(b,a[j])==0)
{
printf("%s\n",b);//如果有,直接输出
find=1;
break;
}
}
if(!find)
{
int len=strlen(b);
for(int t=0; t<len-1; t++)//从第一个开始依次尝试交换相邻字母后是否符合
{
char c[N+5],temp;
strcpy(c,b);
temp=c[t],c[t]=c[t+1],c[t+1]=temp;
for(int k=0; k<n; k++)
{
if(!strcmp(c,a[k]))
{
printf("%s\n",c);//如果交换字母后相同,输出并跳出循环。
break;
}
}
}
}
}
return 0;
}
//////////////////////////////////////////////////////////
测试用例
//////////////////////////////////////////////////
样例输入
3
ABCD
ACBD
BADC
3
ACBD
ABDC
BBDD
样例输出
ACBD
BADC
ABCD 展开
2个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询