2017-02-22 81 views
-1

我有两个字符串,我想知道它们是否彼此相等。然而,字符串字符顺序已被随机化。另外某些字符可能已通过通配符运算符(*)换出。我正在使用它来进行Anagram检测。比较字符串与通配符运算符(*)和随机顺序 - Anagrams


在这种情况下,我试图得到anagram程序,我不得不说ab **是abba的一个字谜。现在它可以告诉它是否是一个字谜,如果它实际上是一个像abba和bbaa这样的字谜。现在我想弄清楚如何实现通配符*,我不知道从哪里开始,请帮助!

我有什么至今:

#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 
#define SIZE 5 



bool areAnagram(char *str1, char *str2) 
{ 

    int count[SIZE] = {0}; 
    int i = 0; 

    for (i = 0; str1[i] && str2[i]; i++) 
    { 
     count[str1[i]]++; 
     count[str2[i]]--; 
    } 

    if (str1[i] || str2[i]) 
    { 
     return false; 
    } 



    for (i = 0; i < SIZE; i++) 
    { 
     if (count[i]) 
     { 
      return false; 
     } 
    } 

    return true; 
} 

int main() 
{ 
    char str1[SIZE], str2[SIZE]; 

    FILE *finput; 

    finput = fopen("input.txt", "r"); 

    fscanf(finput, "%s %s", str1, str2); 

    printf("%s\n", str1); 
    printf("%s\n", str2); 

    if(areAnagram(str1, str2)) 
    { 
     printf("THEY ARE ANAGRAMS\n"); 
    } 
    else 
    { 
     printf("THEY AREN'T ANAGRAMS\n"); 
    } 
} 
+0

@TessellatingHeckler abba和bbaa是anagrams,它是input.txt设置为 – Vcoss

+0

哦,现在我明白你的意思了。雅是多数民众赞成破碎的代码哎呀brb – Vcoss

+1

'abaa''baba'''他们是ANAGRAMS' - 不,他们仍然不是?你正在初始化count [SIZE]一个5元素数组,索引0,1,2,3,4。然后你用'count [str1 [i]]索引它 - str1是一个字符数组,所以字母“a”将是ASCII字符数97,所以你正在执行'count [97]'的数组变为0-4。我想你正在咀嚼随机未分配的记忆。然后你试着在'count [i]'五个地方寻找结果。如果你数数足够大并改变计数器,这种方法可能会奏效,但现在它已经基本上被打破了。 – TessellatingHeckler

回答

1

与选择排序算法的工作方式类似,但不是检查整数值来排列我只是使用字符串比较来选择/删除并添加(*)的异常。遍历整个列表和中提琴!

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

int main() { 

    char inputString[] = "AB**";//input string (with asterisks) 
    char comparisonString[] = "AYYB";//comparison string (without asterisks) 

    int inputString_length = strlen(inputString); 
    int comparisonString_length = strlen(comparisonString); 

    int anagram = 1;//boolean 

    if (inputString_length != comparisonString_length) { 
     anagram = 0; 
    } else { 

     int i = 0; 
     while ((i < inputString_length) && (anagram == 1)) { 

      char *letterToCheck = inputString[0]; 
      memmove(&inputString[0], &inputString[0 + 1], strlen(inputString) - 0);//remove first character 

      int j = 0; 
      int comparisonString_length_new = strlen(comparisonString); 
      int matchFound = 0;//boolean 
      while ((j < comparisonString_length_new) && (matchFound == 0)) { 
       char *letterToCompare = comparisonString[j]; 

       if (letterToCheck == '*') { 
        matchFound = 1; 
       } 

       if (letterToCheck == letterToCompare) { 
        matchFound = 1; 
        memmove(&comparisonString[j], &comparisonString[j + 1], strlen(comparisonString) - j);//remove matched character 
       } 

       j++; 
      } 

      if (matchFound == 0) { 
       anagram = 0; 
      } 


      i++; 
     } 

    } 


    if (anagram == 0) { 
     printf("Are NOT Anagrams"); 
    } else { 
     printf("Are Anagrams"); 
    } 

} 

另一种解决方案,其中输入和比较字符串可能包含*(注意:此溶液以下通过非现场用户和不OP加入,它也没有被测试或验证由OP)

#include <stdio.h> 

#define CHAR_LEN 4 
#define SPECIAL_CHARACTER '*' 

int count_special_char(char *string) { 
    int i = 0, count = 0; 
    for(i = 0; i < CHAR_LEN; i++) { 
     if(string[i] == SPECIAL_CHARACTER) 
      count++; 
    } 
    return count; 
} 

int is_anagram(char *string_a, char *string_b) { 
    int i, y; 
    int found_count = 0; 
    int a_special = count_special_char(string_a); 
    int b_special = count_special_char(string_b); 

    for(i = 0; i < CHAR_LEN; i++) { 
     if(string_a[i] == SPECIAL_CHARACTER) //compare only non-asterisk char 
      continue; 

     for(y = 0; y < CHAR_LEN; y++) { 
      if(string_a[i] == string_b[y]) { 
       string_b[y] = '\0' //treat this char as found 
       found_count++; 
       break; 
      } 
     } 
    } 

    if((found_count + a_special + b_special) >= CHAR_LEN) 
     return 1; 
    else 
     return 0; 
} 

int main() { 
    char a[CHAR_LEN] = "**CD"; 
    char b[CHAR_LEN] = "AB**"; 

    if(is_anagram(a, b)) 
     printf("yes\n"); 
    else 
     printf("no\n"); 

    return 0; 
} 

A ***和* XYZ被认为是anagram,因为第一个字符串有3 *,可以代表第二个字符串XYZ。第二个字符串有1 *代表第一个字符串A.如果有任何错误,请指出并帮助。谢谢!

+0

在第一个解决方案,我在 '字符* letterToCheck = STR1 [0]得到一个错误;' 说,这是一个不兼容的整数指针转换初始化“字符*” – Vcoss

+0

@Vcoss你复制粘贴直接进入一个新项目要测试吗?我只是复制粘贴到一个在线的C IDE,它工作得很好 –