旋转意味着通过将另一个字符串向右移动一个或多个位来创建一个字符串。例如,abc和cab是旋转,abcd和bacd不是旋转。 我编写了下面的代码但是它没能通过最后一个测试用例(不知道它是什么)。任何人都可以给我一些关于哪里出错或者是否有更高效算法的提示:
int isLetterInWord(char c, char* word)//find first letter in the word which is equal to c
{
int len = strlen(word);
for(int i=0; i<len; ++i)
{
if(c==word[i])
return i;
}
return -1;
}
int isRotation(char* word1, char* word2)
//check if word1 and word2 are rotation. if so return 1 otherwise -1
{
if(word1 == NULL && word2 == NULL)
return 1;
int len1 = strlen(word1);
int len2 = strlen(word2);
if(len1!= len2)
return -1;
for(int i=0; i<len1; ++i)
{
int pos = isLetterInWord(word1[i], word2);
if(pos == -1)
return -1;
else
{
int p1 = i, p2 = pos;
int cnt=0;
while(cnt<len1)
{
if(word1[p1++]!=word2[p2++])
break;
if(p1==len1)p1=0;
if(p2==len2)p2=0;
cnt++
}
if(cnt==len1)
return 1;
}
}
return -1;
}
答案 0 :(得分:2)
解决此问题的另一种算法如下: 让我们说第一个字符串是str1,需要检查str2是否是str1的旋转。 算法如下:
concatanate str1 to str1. Lets call it str3.
Now check whether str2 is a sub-string of str3.
If str2 is sub-string of str3 then it is a rotation of str1 otherwise not.
请找到检查字符串旋转的函数:
int Rotations(char *str1, char *str2)
{
int size1 = strlen(str1);
int size2 = strlen(str2);
char *temp;
void *ptr;
if (size1 != size2)
return 0;
temp = (char *)malloc(sizeof(char)*(size1*2 + 1));
temp[0] = '\0';
strcat(temp, str1);
strcat(temp, str1);
ptr = strstr(temp, str2);
free(temp);
if (ptr != NULL)
return 1;
else
return 0;
}
答案 1 :(得分:0)
if(word1==NULL&&word2==NULL)
这应该是
if(word1==NULL||word2==NULL)
没有完成你的逻辑。
答案 2 :(得分:-1)
概述:在字符串中查找匹配char的第一个字符串,然后在字符串上执行xor,直到最小长度字符串结束,这样就可以找到字符串是否是彼此的旋转字符串
前提条件:两个字符串的长度相等,如上所述答案
第1步:在第一个字符串中的字符串通知pos
(位置)中找到第一个匹配的字符。
第2步:现在对pos
的第一个字符串执行xor到第一个字符串的结尾,使用与第二个字符串相同长度的子字符串。
步骤3:如果结果xor为0则表示匹配的字符串的第一部分匹配,并继续匹配剩余部分(子字符串),这是第一个字符串中的第一个字符串为char {{ 1}},和从pos-1
的第二个字符串到字符串结尾的子字符串,然后对它们执行相同的xor,
第4步:如果匹配,则以sucess退出,如果不匹配,则在第一个字符串中找到下一个匹配的pos+1
,并从步骤2开始重复,直到达到结束第一个字符串