鉴于两个句子列表,我如何找到句子对,其中一个句子中的所有单词都包含在另一个句子中?
示例:
List1: {"free bar", "hello world", "foo"}
List2: {"hello there world", "foobar", "bar"}
输出应该告诉我List1中的“hello world”包含在List2的“hello there world”中,List2中的“bar”包含在List1的“free bar”中。另一方面,“foo”和“foobar”不匹配。
我尝试使用c#和LINQ来运行所有内容并与正则表达式匹配,但这太慢了。通常,这些列表包含至少2500个长度为1-6个字的句子。
就像一张纸条一样,它不必是列表。可能是HashMaps或其他任何东西。希望有人能指出我正确的方向。
答案 0 :(得分:0)
这是一种使用哈希集字典进行预处理list2
的方法 - 总体上是O(n * m),n =列表1中的单词数,m =列表2中的句子数(不包括预处理):
var list1 = new List<string>() { "free bar", "hello world", "foo" };
var list2 = new List<string>() { "hello there world", "foobar", "bar" };
var wordMap = new Dictionary<string, HashSet<int>>();
for(int i = 0; i< list2.Count; i++)
{
var words = list2[i].Split(' ');
foreach(var word in words)
{
if(!wordMap.ContainsKey(word))
{
wordMap[word] = new HashSet<int>();
}
wordMap[word].Add(i);
}
}
foreach(var item in list1)
{
bool foundMatch = false;
var words = item.Split(' ');
for (int i = 0; i < list2.Count;i++ )
{
foundMatch = words.All(word => !wordMap.ContainsKey(word) ? false : wordMap[word].Contains(i));
if(foundMatch)
{
Console.WriteLine("Found matching sentence in list 2: " + list2[i]);
}
}
}
实际上,这应该比任何字符串比较快得多。