比较两个字符串以查看它们是不是旋转[关闭]

Posted

技术标签:

【中文标题】比较两个字符串以查看它们是不是旋转[关闭]【英文标题】:Comparing two strings to see if they are rotation [closed]比较两个字符串以查看它们是否旋转[关闭] 【发布时间】:2014-11-03 06:25:34 【问题描述】:

旋转意味着一个字符串是通过将另一个字符串向右移动一位或多位来创建的。例如 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;
    

【问题讨论】:

提示:查看测试用例,看不出它是什么。 你不知道你的代码失败的测试用例,所以我假设它是为了编码比赛。错误也可能在于读取要比较的字符串,也许您达到了大小限制或忘记满足空格。长字符串也有超时的可能性;您的解决方案不是最有效的。 【参考方案1】:

解决这个问题的另一种算法如下: 假设第一个字符串是 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;

【讨论】:

【参考方案2】:
if(word1==NULL&&word2==NULL)

这应该是

if(word1==NULL||word2==NULL)

没有通过你的逻辑。

【讨论】:

【参考方案3】:

概述:在字符串中找到第一个匹配char的字符,然后对字符串进行异或,直到最小长度的字符串结束,这样就可以判断字符串是否是彼此的旋转字符串

前置条件:两个字符串的长度相等,如上答案所述

第 1 步: 在两个字符串中找到第一个匹配的 char,通知第一个字符串中 char 的 pos(position)。

第 2 步: 现在对第一个字符串从 pos 到第一个字符串的末尾执行异或,子字符串与第二个字符串的长度相同。

第 3 步: 如果结果 xor 为 0,则表示匹配的字符串的第一部分匹配,然后继续匹配剩余部分(子字符串),即第一个字符串中的第一个 char 到 @987654323 处的 char @, 以及从pos+1 到字符串结尾的第二个字符串的子字符串,然后对它们执行相同的异或,

第 4 步: 如果匹配则成功退出,如果不匹配则在第一个字符串中找到下一个匹配的 char,并从第 2 步重复,直到到达第一个字符串的末尾

【讨论】:

异或检查零比直接比较字符更好吗?特别是 xoring 需要额外的字符串或回补。此外,OP 已经有一个有效的解决方案,如果效率低下的话。任务是在他的代码中指出一个未知测试用例的失败。 Xor 是逻辑运算,所以它在最短的 CPU 周期内执行 JPE 指令总是比 XOR 后跟 JPE 快。

以上是关于比较两个字符串以查看它们是不是旋转[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何比较每个字典中 JSON Array 键值的字符串以查看它们是不是包含 NSUserDefault 字符串并返回 JSON 字典匹配项

如何检查2个字符串是不是相互旋转?

比较两个数组中的项目以查看它们的总和是不是为 10

查看两个字符串是不是为 Anagrams [C++]

从 UIImage 生成哈希

比较两个数组是不是相等[关闭]