c-如果一个字符串是另一个字符串的旋转.所有测试用例未运行



我使用的逻辑是连接第二个字符串,然后搜索其中的第一个字符串。但由于某些原因,代码并不是针对所有测试用例运行的。

示例

s1 = rahul , s2 = hulra
s2.s2 = hulrahulra

然后使用CCD_ 3函数在CCD_ 2中搜索CCD_。

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

int ifRotation(char *s1, char *s2)
{
int l1 = strlen(s1);
int l2 = strlen(s2);
char str1[l1], str2[l2+ l2];
int i;
i = 0;
while(*s1 != '')
{
str1[i] = *s1;
i++;
s1++;   
}
i = 0;
while(*s2 != '')
{
str2[i] = *s2;
i++;
s2++;   
}
strcat(s2, s2);
if(strstr(s2, s1))
{
return 1;
}
return 0;
}
int main() {
//code
int queries;
scanf("%d", &queries);
int array[queries];
char str1[100];
char str2[100];
int i = 0;
while(i < queries)
{
scanf("%s", &str1);
scanf("%s", &str2);
array[i] = ifRotation(str1, str2);
i++;
}
i = 0;
while(i < queries)
{
printf("%dn", array[i]);
i++;
}
return 0;
}

请告诉我代码出了什么问题?

您只是从一个字符串复制到另一个字符串,复制例程有几个问题。

  1. char str1[l1]不够大。它应该是char str1[l1 + 1]。额外的1用于空字符。

  2. 字符串应始终以空字符''结尾。

  3. s1s2递增,直到它们达到空字符,所以到那时s1s10为空。

尝试以下代码来复制字符串,您会看到s1/s2将为空,str1/str2只是原始s1/s2的副本。

您可以按如下方式修复复制:

char str1[l1 + 1], str2[l2 + 1];
int i;
i = 0;
while(*s1 != '')
{
str1[i] = *s1;
i++;
s1++;
}
str1[i] = '';
i = 0;
while(*s2 != '')
{
str2[i] = *s2;
i++;
s2++;
}
str2[i] = '';
printf("s1=%s, s2=%s, str1=%s, str2=%sn", s1, s2, str1, str2);
//output: s1=, s2=, str1=old_s1, str2=old_s2

但这并没有真正取得任何成就。如果您只想检查"rahul"是否与"hulra"相反,请保持s1原样,按相反顺序将s2复制到reverse_s2,并将两个字符串进行如下比较:

#include <stdio.h>
#include <string.h>
int ifRotation(const char *s1, const char *s2)
{
if(!s1 || !s2)
return 0;
int len2 = strlen(s2);
char reverse_s2[len2 + 1];
//copy s2 to reverse_s2 in reverse order:
int i = 0;
for(i = 0; i < len2; i++)
reverse_s2[i] = s2[len2 - i - 1];
reverse_s2[i] = ''; //add null character
int result = strcmp(s1, reverse_s2) == 0;
return result;
}
int main(void) 
{
printf("%dn", ifRotation("rahul", "hulra"));
printf("%dn", ifRotation("rahul", "luhar"));
return 0;
}

最新更新