我有两个包含字母和数字的字符串,用空格分隔。前 “elza7ma wa2fa fel matab”和“2ana ba7eb el za7ma 2awy 2awy”
比较这两个字符串以找出它们是否有共同字的最快方法是什么?
我尝试使用string.split拆分其中一个,并在整个单词数组中使用string.compare。但这很慢,因为我会比较很多字符串。
答案 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)