3

假设我有一定数量的字符串,比如说n,以随机顺序存储在一个数组中。一些,比如说m1,是 anagrams ofstring1m2anagrams ofstring2等等。什么是一种有效的算法来分离作为特定字符串的字谜的字符串并确定每个集合的字符串数量?

4

2 回答 2

1

一个有趣的问题。我们对字谜的了解实际上可以归结为两件事。

  • 它们的长度相同。
  • 它们由相同的字符组成。

确定第一个条件很容易,第二个条件就不那么容易了。通过首先按长度对字符串数组进行排序,您可以限制必须执行第二次测试的字符串数量。

第二个测试似乎要求您不仅要检查 string1.contains(string2[n]) 还要确定它们在每个字符串中出现的次数相同。我可能想要字符串数组的副本,但我会将其设为 char[] 数组,因为字符串是不可变的。然后我可以按其组成字符对副本中的每个字符串进行排序。字谜现在将与 string1 == string2 匹配。

于 2013-06-28T14:09:08.223 回答
0
  #include<stdio.h>
#include<string.h>
int main()
{
  char a[100],b[100],c[100],d[100];
  char temp;
  int i,j;
  printf("Enter the first string\n");
         gets(a);
         printf("Enter the second string\n");
         gets(b);
  strcpy(d,a);
  strcpy(c,b);
  for(i=0;i<strlen(a);i++)
  {
  if(a[i]==' ')
  {
    temp=a[i];
    a[i]=a[i+1];
      a[i+1]=temp;
  }
  }
  a[strlen(a)]='\0';
  for(j=0;j<strlen(b);j++)
  {
    if(b[j]==' ')
    {
      temp=b[j];
      b[j]=b[j+1];
      b[j+1]=temp;
    }
}
  b[strlen(b)]='\0';
if(strlen(a)==strlen(b))
    for(i=0;i<strlen(a);)
    {
      for(j=i;j<strlen(b);j++)
      {
        if(a[i]==b[j])
        {
          temp=b[i];
        b[i]=a[i];
        b[j]=temp;
          i++;
          break;
        }
        }
      }
 if(strcmp(a,b)==0)
      printf("%s and %s are anagrams\n",d,c);
        else
      printf("%s and %s are not anagrams\n",d,c);
      return(0);
    }
于 2015-08-08T11:21:12.250 回答