2013-06-23 52 views
3

假设我有一定数量的字符串,说n,以随机顺序存储在一个数组中。有几个,比如m1,是string1m2的anagrams是string2等等的anagrams。 将一个有效的算法分离出特定字符串的字符串并确定每个字符串的字符串数量会是多少?单独的不同字典

回答

1

一个有趣的问题。我们对一个字谜的了解真的归结为两件事。

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

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

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

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); 
    }