Как сравнить строки (одна строка случайной последовательности) - PullRequest
0 голосов
/ 21 августа 2011

Я хочу сравнить 2 строки, но одна строка в случайной последовательности. Я использую текстовые поля, как это:

Textbox1:
Друзья
дружки
слон

TextBox2:
ASPL

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

Textbox3:
дружки

Что я получил так далеко:

            Textbox3.Clear();
            string[] lines1 = Textbox2.Lines;
            foreach (string line1 in lines1)
            {
                string[] lines = Textbox1.Lines;
                foreach (string line in lines)
                {
                    if (line.Contains(line1))
                    {

                        Textbox3.Text += line;
                        Textbox3.Text += "\r\n";
                    }
                }

             }

Но это скопирует строку в Textbox3, только если строки в Textbox1 и Textbox2 полностью идентичны, а не только если символы идентичны.

Итак, мой вопрос: как мне это сделать?

Ответы [ 4 ]

1 голос
/ 21 августа 2011

Просто отсортируйте строки и сравните результаты, предполагая, что они равны по длине и не равны нулю, это работает:

    private static bool IsPermutation(string one, string two)
    {
        var oneSorted = String.Join("", one.OrderBy(c => c).Select(x => x.ToString()).ToArray());
        var twoSorted = String.Join("", two.OrderBy(c => c).Select(x => x.ToString()).ToArray());

        return oneSorted == twoSorted;
    }

РЕДАКТИРОВАТЬ: Чтобы ответить на комментарий. Добавьте этот метод в ваш класс и замените код внутри foreach на

if (line.Length == line1.Length && IsPermutation(line, line1)) 
{
   Textbox3.Text += line;
   Textbox3.Text += "\r\n";                    
}
1 голос
/ 21 августа 2011

Я бы сказал об этом

  1. Подсчитайте, сколько раз каждая буква вашего целевого слова (textbox2) встречается
  2. Просмотрите список возможных записей (текстовое поле1), которые у вас есть
  3. Подсчитайте, сколько раз каждая буква вашего возможного ввода встречается.
  4. Если совпадение, сохранить слово в textbox3, если нет, продолжить.

Чтобы сделать этот процесс еще быстрее, как уже указывалось, сначала посчитайте длину строки возможного слова, если нет совпадения, затем оставьте это слово и переходите к следующему.

Еще одно улучшение при подсчете букв возможных записей, если вы найдете букву, которой нет в вашем целевом слове, затем откажитесь и переходите к следующему слову.

0 голосов
/ 21 августа 2011

Вам нужно будет сгенерировать все возможные перестановки случайного ввода, а затем сравнить каждую с данными.Как сказал Натаниэль, вы можете оптимизировать его, проверив сначала длины.

См. http://msdn.microsoft.com/en-us/magazine/cc163513.aspx для кода, который генерирует перестановки строк (вы хотите получить все перестановки символов случайной входной строки)

Редактировать

Ответ на вопрос: Список всех перестановок строки / целого числа имеет генератор перестановок, который больше подходит для ваших нужд.Просто добавьте параметр List<string> к методам go и setper и замените Console.Write (list); на results.Add(list).Когда метод вернется, предоставленный вами список будет иметь все перестановки.

0 голосов
/ 21 августа 2011

Я бы перебрал оба списка.Если длина строк одинакова, продолжайте (потенциальное совпадение).Учитывая потенциальное совпадение (одинаковые длины строк), затем выполните итерацию по символам в исходной строке и убедитесь, что каждый из них существует в строке, с которой вы сравниваете его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...