确定两个字符串是否是字谜?

时间:2014-11-13 15:50:32

标签: c

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

static int comp(const void *a, const void *b);

int main(int argc, char ** argv)
{
    char s1[]="";
    char s2[]="";
    char *fmt = "%[^\n]%*c";

    printf("Enter the first word? ");
    scanf(fmt,&s1);

    printf("Enter the second word? ");
    scanf(fmt,&s2);

    qsort(s1, strlen(s1), 1, comp);
    qsort(s2, strlen(s2), 1, comp);

    printf("%s : %s  - %s\n", s1, s2, strcmp(s1, s2) ? "No" : "Yes");
    return 0;
}

static int comp(const void *a, const void *b)
{
    const char *pa = (char*)a;
    const char *pb = (char*)b;

    return
        (*pa > *pb) ?  1 :
        (*pa < *pb) ? -1 :
        0;
}

当我输入'smartest&#39;作为我的第一根绳子和床垫&#39;作为我的第二个字符串,我的输出变为

emrsstt : aemrsstt - No 

为什么缺少字符串的第一个字符?

坐了几个小时。如果有人能指出我可能犯下的愚蠢错误,我很高兴。

3 个答案:

答案 0 :(得分:0)

这样做的一个聪明方法是首先检查可能的anagram 。你可以通过

来做到这一点
  1. 比较字符串长度。

  2. 对整个集合中的每char进行异或;从两个字符串中抽取。

  3. 如果(2)的结果不为零,则字符串不可能是字谜。这样做的好处是(2)在c中非常快,并且大多数字符串不是字谜,即使它们的长度相同。如果您的感觉特别雄心勃勃,那么可以将(1)和(2)组合成一个O(N)算法!

    完成后,请致电您的主代码。您的问题是不允许每个字符串上的 null终结符。您需要为字符串字符分配足够的空间,并为null终止符分配一个额外的元素。

答案 1 :(得分:0)

基本上,当您必须检查任何两组值是否相同时,XOR操作会有所帮助。

Input   Output
A   B
0   0   0
0   1   1
1   0   1
1   1   0

因此,使用此功能,我们可以解决您的问题,如下所示:

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

int main()
{
    int i=0,j=0,f;
char a[30] = "gooo";
char b[30] = "ooog";

if(strlen(a) == strlen(b))
{
  while(a[i] != '\0')
  {
j = 0;
f =0;
     while(b[j] != '\0')
     {
         if( !(a[i] ^ b[j]) )
         {
           f =1;
           break;
         }
         j++;
     }
     if(f)
     i++;
     else
     break;
  }
printf("%d\n",i);
if(i == strlen(a))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

答案 2 :(得分:0)

请检查以下解决方案以获取anagram问题。此解决方案检查两个字符串是否对每个唯一字符具有相同的计数

bool anagram (char s[], char t[])
{
    if (strlen(s) != strlen(t)){
      return false;
    }

    int letters[256];
    memset(letters,(int)0,sizeof(letters));

    int numUniqueChars = 0;
    int numCompletedT = 0;
    int i;
    for (i=0; i < strlen(s); i++){
      if (letters[(int)s[i]]==0){  
         ++numUniqueChars;
      }
      letters[s[i]]=letters[s[i]]+1;
    }

    for (i=0; i < strlen(t); i++){
        int c = (int)t[i]; 
        if (letters[c] == 0){
          return false;
        }
        letters[c]=letters[c]-1;

        if (letters[c] == 0){
           numCompletedT++;
           if (numUniqueChars==numCompletedT){
               return i == strlen(t)-1;
           }
        }
    }
  return false;

}