我使用的逻辑是连接第二个字符串,然后搜索其中的第一个字符串。但由于某些原因,代码并不是针对所有测试用例运行的。
示例
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;
}
请告诉我代码出了什么问题?
您只是从一个字符串复制到另一个字符串,复制例程有几个问题。
-
char str1[l1]
不够大。它应该是char str1[l1 + 1]
。额外的1用于空字符。 -
字符串应始终以空字符
' '
结尾。 -
s1
和s2
递增,直到它们达到空字符,所以到那时s1
和s1
0为空。
尝试以下代码来复制字符串,您会看到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;
}