在与后缀相同的字符串中标识前缀

时间:2014-02-23 10:21:32

标签: c string

EG -

maabcma是有效的,因为它包含ma作为正确的前缀以及正确的后缀。 panaba不是。

如何在C语言中查明某个单词是否有效?

我不太擅长字符串操作。所以,请用伪代码帮我解决。

提前致谢。

我完全迷失了。 T =测试用例数。

编辑:新代码。我到目前为止最好的代码 -

#include<stdio.h>
#include<string.h>

void main()
{

int i,T,flag=0;
int j,k,len=0;
char W[10],X[10];

scanf("%d",&T);

for(i=0;i<T;i++)
{
scanf("%s",W);

for(len=0;W[len]!='\0';len++)
X[len]=W[len];
X[len]='\0';


for(j=len-1;j>=0;j--)
for(k=0;k<len;k++)

{
if(X[k]!=W[j])
flag=0;

else if((j-k)==(len-1))
flag==1;

}


if (flag == 1)
printf("NICE\n");
else
printf("NOT\n");
}
}

仍然没有得到正确的结果。我哪里错了?

2 个答案:

答案 0 :(得分:0)

问题是,如果匹配存在,您只设置标志的值,否则您必须将其设置为0.因为如果我有,请参阅:

pammbap

我的前缀是pam,后缀是bap

根据最终的循环,

pa匹配,因此标记设置为1

但是当谈到bm时,它不会变为零。因此,它返回true。

答案 1 :(得分:0)

首先,void不是main的有效返回类型,除非您正在为Plan 9进行开发。

其次,你应养成检查scanf()和所有输入函数的返回值的习惯。如果用户未输入数字,则不能依赖T的值,因为T未初始化。同样,您不应将scanf无界 %s扫描操作一起使用。如果用户输入20个字符,则不适合您拥有的十个字符缓冲区。另一种方法是使用fgets一次获取整行文本,或者使用有界扫描操作。如果您的数组适合10个字符(包括空终止符),那么您可以使用scanf("%9s", W)

第三,单字符变量名通常很难理解。使用W而不是word而不是T,而不是使用testCount或类似内容。这意味着第一次查看代码的人可以更轻松地找出每个变量的用途。

最重要的是,想想你脑海中的过程,并将其记录在纸上。你会如何自己解决这个问题?例如,从 n = 1开始,

  1. 从字符串中取出第一个 n 字符。
  2. 将其与字符串
  3. 中的最后 n 字符进行比较
  4. 他们匹配吗?
    1. 如果是,请打印出第一个 n 字符作为后缀并停止处理。
    2. 如果不是,请递增 n 并重试。尝试直到 n 位于字符串的中间。
  5. 还有一些其他的事情需要考虑,你想要最大的匹配吗?例如,在输入字符串ababcdabab中,前缀ab也是后缀,但关于abab可以说相同。在这种情况下,您不希望停止处理,即使找到前缀也希望继续处理,因此,您应该只存储最大前缀的 length ,也就是后缀。

    第二重要的是,在学习C时遇到这样的障碍是非常普遍的,所以不要让这会让你的热情变得迟钝,只是继续努力!