Алгоритм сравнения строк C# - PullRequest
0 голосов
/ 24 марта 2020

Я должен создать алгоритм, который сравнивает две строки и возвращает логическое значение.

Это правда, если все буквы строки a присутствуют в строке b.

например "romain "and" marion "возвращает true.

" world "и" dlrow "возвращает true.

мой код работает только в том случае, если нет дубликатов, и я не понимаю, почему. Спасибо за вашу помощь.

        string a = @"aka";
        string b = @"aka";

        bool istwin(string x, string y)
        {
            int compteur = 0;
            if (x.Count() == y.Count())
            {
                int index = x.Count();

                for (int i = 0; i < index; i++)
                {
                    for (int z = 0; z < index; z++)
                    {
                        Console.WriteLine(x[z] + "  comparé  à " + y[i]+"indexs : "+z+" ,  "+i);
                        if (x[z] == y[i])
                        {
                            compteur++;
                        }                         
                    }

                }
                Console.WriteLine();
                Console.WriteLine(compteur);
                if (compteur == index)
                  {
                     return true;
                  }
                   else
                   {
                    return false;
                   }

            }
            else
            {
                return false;
            }

        }

        //istwin(a, b);
        Console.WriteLine(istwin(a, b));
    }

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Другие показали ответы, используя LINQ. Это продвинутая концепция программирования. При изучении C# вы можете сделать это без LINQ. Ниже приведены два возможных алгоритма.


Проблема в вашем коде состоит в том, что (в примере с 2 "aka") вы дважды учитываете первое "a" во втором "aka" и втором "a" также.

С "aka" и "akb" это даст вам правильный счет, потому что он найдет каждую букву первого слова во втором один раз. И это тоже неправильно.


Одним из решений будет удаление каждой буквы из второго слова, когда оно будет найдено. Мы делаем это просто, заменяя букву символом NUL:

private static bool IsAnagramRemove(string s, string t)
{
    if (s.Length != t.Length) {
        return false;
    }

    // Convert second word to char array, so we can remove matched letters.
    char[] tChar = t.ToCharArray();

    int count = 0;
    for (int i = 0; i < s.Length; i++) {
        for (int j = 0; j < tChar.Length; j++) {
            if (s[i] == tChar[j]) {
                tChar[j] = (char)0; // Remove (well.., replace by 0).
                count++;
                break; // Leave the inner loop.
            }
        }
    }
    return count == s.Length;
}

Обратите внимание, что вы можете заменить это

if (compteur == index)
{
    return true;
}
else
{
    return false;
}

этим

return compteur == index;

Поскольку выражение compteur == index возвращает логическое значение, представляющее результат сравнения.


Другая возможность состоит в том, чтобы сначала отсортировать буквы в обоих словах, чтобы затем можно было сравнивать буквы в одном и том же позиция в обоих словах:

private static bool IsAnagramSort(string s, string t)
{
    if (s.Length != t.Length) {
        return false;
    }
    char[] a = s.ToCharArray();
    char[] b = t.ToCharArray();
    Array.Sort(a);
    Array.Sort(b);
    for (int i = 0; i < a.Length; i++) {
        if (a[i] != b[i]) {
            return false;
        }
    }
    return true;
}

Не нужно здесь считать. Если вы достигнете конца l oop, это значит, что мы нашли анаграмму.

3 голосов
/ 25 марта 2020

Вы можете упростить свой алгоритм, используя метод Except из System.Linq. Поскольку string в C# представляет последовательность символов, доступную только для чтения, вы можете получить разницу между двумя последовательностями и проверить ее количество

bool istwin(string x, string y)
{
    return x.Except(y).Count() == 0;
}

Будет возвращено true, например, строки

Console.WriteLine(istwin("aka", "aka")); //returns true
Console.WriteLine(istwin("world", "dlrow")); //returns true
Console.WriteLine(istwin("romain", "marion")); //returns true

Чтобы охватить случай, когда строки "a" и "aaa" должны возвращать false (согласно комментариям), вы можете добавить дополнительную проверку длины строк, например

bool istwin(string x, string y)
{
    return x.Length == y.Length && x.Except(y).Count() == 0;
}

Результат будет следующим

Console.WriteLine(istwin("a", "aaa")); //returns false
Console.WriteLine(istwin("a", "abc")); //returns false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...