C#比较两个匹配单词的字符串

时间:2010-09-24 07:37:43

标签: c# string

我有两个包含字母和数字的字符串,用空格分隔。前 “elza7ma wa2fa fel matab”和“2ana ba7eb el za7ma 2awy 2awy”

比较这两个字符串以找出它们是否有共同字的最快方法是什么?

我尝试使用string.split拆分其中一个,并在整个单词数组中使用string.compare。但这很慢,因为我会比较很多字符串。

5 个答案:

答案 0 :(得分:14)

LINQ解决方案

"elza7ma wa2fa fel matab".Split()
                         .Intersect("2ana ba7eb el za7ma 2awy 2awy".Split())
                         .Any();

// as a string extension method
public static class StringExtensions
{
    public static bool OneWordMatches(this string theString, string otherString)
    {
        return theString.Split().Intersect(otherString.Split()).Any();
    }
}

// returns true
"elza7ma wa2fa fel matab 2ana".OneWordMatches("2ana ba7eb el za7ma 2awy 2awy");

答案 1 :(得分:5)

我认为最简单的方法是将字符串分解为单词并使用像HashSet<string>这样的集合结构来检查重复项。例如

public bool HasMatchingWord(string left, string right) { 
  var hashSet = new HashSet<string>(
    left.Split(" ", StringSplitOptions.RemoveEmptyEntries)); 
  return right
    .Split(" ", StringSplitOptions.RemoveEmptyEntries)
    .Any(x => hashSet.Contains(x));
}

答案 2 :(得分:1)

您可以按字分割两个字符串并构建两个哈希表/字典。然后浏览两者并添加在第三个字典(Dictionary<string, int>)中递增int的键。如果第三个字典中的任何键的计数多于一个,则该单词都在原始字符串中。

我认为解决这个问题的任何算法都会“慢” - 特别是对于大输入字符串/很多单词。

答案 3 :(得分:0)

我可能会初始性能下降并拆分字符串,然后按字母顺序和字长排序。 如果你只需要找出一个单词是否匹配,一找到就会中断。 一旦按字母顺序和长度排序拆分字符串数组,就会限制您必须进行的比较次数。

答案 4 :(得分:0)

  • 最简单的方法是将所有单词与任何其他单词进行比较。这是一个简单的解决方案,但速度很慢。
  • 另一种方法是对两个列表进行排序,然后比较前两个条目。像mergesort一样,但目标是寻找平等的话语。
  • 另一种方法是将单词列表编译成树,并将单词与该树匹配。正则表达式可以做到这一点,或者你可以自己做。在您的示例中,第一个字母应为2,b,e或z。这样,每个单词只进行一次检查,并检查最少数量的字符。