正在搜索一个短语

时间:2012-03-17 15:06:33

标签: c# .net search data-structures tree

我有一个单词数组,这些单词取自一个句子(句子中的每个单词都放在一个数组中)。

用户可以搜索短语以查看是否在此句中找到了该短语。这是通过字符的偏移值来确定的。这意味着每个单词都会被检查,看它是否单独存在于短语中,然后进行检查以查看单词是否在彼此之后(由句子中的空格分隔)。

单词存储在树中,因此偏移值(字符位置)是唯一决定在哪个单词之后(并用空格分隔)的单词。

我的问题是,相同(并且已经存储在树中)的单词具有相同的偏移值,因此每个单词存储所有与特定单词一起分配的偏移值的数据结构。这是我到目前为止所获得的代码,除了在以下情况下失败之外,它完美地运行:

例如,我有这句话:this is a test to see if this is working

如果我搜索“这是一个”,则会返回第一个this is以及this is a

以下是代码:

for (int i = 0; i < offsets.Count - 1; i++)
{
    LinkedList<int> current = allOffsets[i];
    LinkedList<int> next = allOffsets[i + 1];

    for (int j = 0; j < current.Count; j++)
    {
        for (int k = 0; k < next.Count; k++)
        {
            if (current.ElementAt(j) + words[i].Length - 1 + 2 == next.ElementAt(k))
            {
                if (!finalResult.Contains(current.ElementAt(j)))
                {
                    finalResult.Add(current.ElementAt(j));
                }

                if (!finalResult.Contains(next.ElementAt(k)))
                {
                    finalResult.Add(next.ElementAt(k));
                }
            }
        }
     }
}

return finalResult;

请注意,finalResult是存储所有“有效”偏移量的列表,offsets存储树中的所有偏移量。 words是一个数组,其中包含从句子中分割出来后的所有单词。

编辑:另请注意,我正在检查单词是否相互跟随,将单词的第一个字母的偏移量加2(以考虑空格)将等于下一个单词的第一个字母的偏移量,如果接下来的话。

1 个答案:

答案 0 :(得分:0)

        var source = new List<string>() { "this", "is", "a", "test", "to", "see", "if", "this", "is", "working" };
        var userInput = "this is a";
        var inputList = userInput.Split(' ');
        var inputListCount = inputList.Count();
        var exists = false;
        for (int i = 0; i < source.Count; i++)
        {
            if (inputList[0] == source[i])
            {
                var found = true;
                for (int j = 1; j < inputListCount; j++)
                {
                    if (inputList[j] != source[j])
                    {
                        found = false;
                        break;
                    }
                }

                if (found)
                {
                    exists = true;
                    break;
                }
            }
        }

        Console.WriteLine(exists);