分开不同的字谜

Posted

技术标签:

【中文标题】分开不同的字谜【英文标题】:Separate different anagrams 【发布时间】:2013-06-19 20:59:37 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:
  #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);
    

【讨论】:

以上是关于分开不同的字谜的主要内容,如果未能解决你的问题,请参考以下文章

代码高尔夫:查找所有字谜

比较字谜字符串时输出错误

用PHP写一个字谜函数?

字谜排序版本与计数字符版本

字谜检测方法c++。将字符串转换为 ascii 值的问题

无法理解这个字谜问题解决方案背后的逻辑[关闭]