2017-02-22 23 views
-1

У меня есть две строки, я хочу знать, равны ли они друг другу. Однако характерный порядок строк был рандомизирован. Также некоторые символы могут быть заменены оператором подстановки (*). Я использую это для обнаружения Anagram.Сравнение строк с помощью подстановочного оператора (*) и рандомизированного порядка - Анаграммы


В этом случае я пытаюсь получить программу анаграммы, я должен сказать, что абы ** является анаграммой авву. Прямо сейчас он может сказать, является ли его анаграммой, если это буквально анаграмма, подобная абба и ббаа. Теперь я пытаюсь понять, как реализовать wildcard *, и я понятия не имею, с чего начать, пожалуйста, помогите!

Что я до сих пор:

#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 - это анаграммы, и это то, что input.txt установлено на – Vcoss

+0

Теперь я теперь то, что вы имеете в виду. ya thats сломанный код whoops 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

В системах Linux и Posix, вы можете использовать подстановку соответствующих функций. См glob(7) и смотреть в glob(3), fnmatch(3), wordexp(3) и т.д.

Смотри также в regcomp(3)

Если вам нужно написать его самостоятельно, прочитать о finite state machines, context free grammars, regular grammars, regular expressions, parsing.

+0

Под '' * ''OP означает один символ. Не так ли? В regex '' * ''может стоять любое количество символов. –

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)

#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 предполагается как анаграмма, потому что первая строка имеет 3 *, которая может представлять вторую строку XYZ. И вторая строка имеет 1 *, которая может представлять первую строку A. Если есть какие-либо ошибки, укажите и помогите. Благодаря!

+0

В первом решении я получаю сообщение об ошибке при 'полукокса * letterToCheck = str1 [0];' говоря, что это несовместимое целое для преобразования указателя инициализация «символа *» – Vcoss

+0

@Vcoss ли вы копировать вставить его непосредственно в новый проект для тестирования? Я просто скопировал его в онлайн-C IDE, и он отлично работал –