如何比较行(一行随机序列)



我想比较两行,但其中一行是随机序列。我使用文本框,像这样:

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 += "rn";
                    }
                }
             }

但是这只会在Textbox1和Textbox2中的行完全相同的情况下将该行复制到Textbox3,而不仅仅是字符相同。

所以我的问题是:我该怎么做?

简单地对字符串进行排序,并在假设它们长度相等且不为空的情况下比较结果:

    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 += "rn";                    
}

我的做法是

  1. 计算目标单词(textbox2)的每个字母出现的次数
  2. 循环遍历
  3. 的可能条目列表(textbox1)
  4. 计算每个字母可能出现的次数。
  5. 如果匹配,保存到textbox3,如果不匹配,继续。

为了使这个过程更快,正如已经指出的,首先计算可能的单词的字符串长度,如果没有匹配,然后放弃这个单词并继续下一个。

进一步增强,在计算可能条目的字母时,如果发现目标单词中没有字母,则放弃并继续查找下一个单词。

我会遍历这两个列表。如果字符串的长度相同,则继续(潜在匹配)。给定一个潜在的匹配(相同的字符串长度),然后遍历源字符串中的字符,并确保每个字符都存在于与之比较的字符串中。

您必须生成随机输入的所有可能排列,然后将每种排列与数据进行比较。就像Nathaniel说的,你可以先检查长度来优化它。

请参阅http://msdn.microsoft.com/en-us/magazine/cc163513.aspx获取生成字符串排列的代码(您将希望获得随机输入字符串的所有字符排列)

编辑

问题的答案:列出字符串/整数的所有排列有一个更适合您需要的排列生成器。只需在gosetper方法中增加一个List<string>参数,将Console.Write (list);替换为results.Add(list)即可。当该方法返回时,您提供的列表将包含所有的排列。

最新更新