如何比较行(一行随机序列)
本文关键字:随机 一行 比较 何比较 | 更新日期: 2023-09-27 18:06:07
我想比较两行,但其中一行是随机序列。我使用文本框,像这样:
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";
}
}
}
但是这只会在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 += "'r'n";
}
我的做法是
- 计算目标单词(textbox2)的每个字母出现的次数
- 循环遍历 的可能条目列表(textbox1)
- 计算每个字母可能出现的次数。
- 如果匹配,保存到textbox3,如果不匹配,继续。
为了使这个过程更快,正如已经指出的,首先计算可能的单词的字符串长度,如果没有匹配,然后放弃这个单词并继续下一个。
进一步增强,在计算可能条目的字母时,如果发现目标单词中没有字母,则放弃并继续查找下一个单词。
我会遍历这两个列表。如果字符串的长度相同,则继续(潜在匹配)。给定一个潜在的匹配(相同的字符串长度),然后遍历源字符串中的字符,并确保每个字符都存在于与之比较的字符串中。
您必须生成随机输入的所有可能排列,然后将每种排列与数据进行比较。就像Nathaniel说的,你可以先检查长度来优化它。
请参阅http://msdn.microsoft.com/en-us/magazine/cc163513.aspx获取生成字符串排列的代码(您将希望获得随机输入字符串的所有字符排列)
编辑
问题的答案:列出字符串/整数的所有排列有一个更适合您需要的排列生成器。只需在go
和setper
方法中增加一个List<string>
参数,将Console.Write (list);
替换为results.Add(list)
即可。当该方法返回时,您提供的列表将包含所有的排列。