Anagram Solver, массив [26] не работает правильно - PullRequest
0 голосов
/ 27 февраля 2012

Я почти закончил свою программу решения анаграмм, где я ввожу две строки и получаю результат того, являются ли они анаграммами друг друга.В этом примере я использую «Платеж получен» и «Каждый цент заплатил мне».

Проблема, которую я получаю, состоит в том, что, когда я вывожу массивы letterCount, letterCount1 неверен (он не думает, чтосимвол 'd', но есть.) но letterCount2 верен.

Может кто-нибудь увидеть проблему с этим, потому что я полностью сбит с толку?

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

int checkAnagram(char string1[], char string2[])
{
        int i;
    int count = 0, count2 = 0;
    int letterCount1[26] = {0};
    int letterCount2[26] = {0};

    for(i = 0; i < strlen(string1); i++)
    {
        if(!isspace(string1[i]))
        {
            string1[i] = tolower(string1[i]);
            count++;
        }
    }

    for(i = 0; i < strlen(string2); i++)
    {
        if(!isspace(string2[i]))
        {
            string2[i] = tolower(string2[i]);
            count2++;
        }
    }

    if(count == count2)
    {
        for(i = 0; i < count; i++)
        {
            if(string1[i] >='a' && string1[i] <= 'z')
            {
                letterCount1[string1[i] - 'a'] ++;
            }

            if(string2[i] >='a' && string2[i] <= 'z')
            {
                letterCount2[string2[i] - 'a'] ++;
            }
        }

        printf("%s\n", string1);

        for(i = 0; i < 26; i++)
        {
            printf("%d ", letterCount1[i]);
            printf("%d ", letterCount2[i]);
        }
    }
}

main()
{
    char string1[100];
    char string2[100];

    gets(string1);
    gets(string2);

    if(checkAnagram(string1, string2) == 1)
    {
        printf("%s", "Yes");
    } else
    {
        printf("%s", "No");
    }
}

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Это потому, что ваш счет содержит количество непробельных символов, но вы сохраняете строки с пробелами.

Например, строка «hello world» имеет 11 символов, но если вы пропустите ее через циклы, ваш счет будет 10 (вы не будете считать пространство). Однако, когда вы позже пройдете по строкам и посчитаете появление каждой буквы, вы пройдете по первым 10 символам, поэтому полностью игнорируете последний символ - a 'd'.

Чтобы исправить это, вам нужно перебрать все символов строки и считать только буквенно-цифровые символы.

0 голосов
/ 27 февраля 2012

Я исправил это для вас:

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

int checkAnagram(char string1[], char string2[])
{
    int i;
    int count = 0, count2 = 0;
    int letterCount1[26] = {0};
    int letterCount2[26] = {0};
    int len1 = strlen(string1);
    int len2 = strlen(string2);

    for(i = 0; i < len1; i++)
    {
        if(!isspace(string1[i]))
        {
            string1[i] = tolower(string1[i]);
            count++;
        }
    }

    for(i = 0; i < len2; i++)
    {
        if(!isspace(string2[i]))
        {
            string2[i] = tolower(string2[i]);
            count2++;
        }
    }

    if(count == count2)
    {
        for (i=0; i<len1; i++)
            if (!isspace(string1[i]))
                letterCount1[string1[i]-'a']++;
        for (i=0; i<len2; i++)
            if (!isspace(string2[i]))
                letterCount2[string2[i]-'a']++;

        int flag = 1;
        for(i = 0; flag && i < 26; i++)
            if (letterCount1[i] != letterCount2[i])
                flag = 0;
        return flag;
    }
    return 0;
}

main()
{
    char string1[100];
    char string2[100];

    gets(string1);
    gets(string2);

    if(checkAnagram(string1, string2) == 1)
    {
        printf("%s", "Yes");
    } else
    {
        printf("%s", "No");
    }
}

Во-первых, не рассчитывайте длину строки внутри цикла.Я извлек их в переменные len1 и len2.

Во-вторых, ваш цикл был неправильным!Вы не должны подниматься до count, вы должны идти до длины этой строки.

В-третьих, вы ничего не возвращали из функции checkAnagram.

...