查找两个字符串中存在的最长文本片段

时间:2016-11-24 15:51:07

标签: c#

我需要找到两个字符串中存在的最长文本片段以及片段为两个字符串开始的行号。在这种情况下,我将文本存储在Book类中,因为它对我必须处理的其他事情有意义。我需要在我的主类中使用一个方法,它看起来像这样:

static void FindLongestFragment(Book book1, Book book2, out string fragment, out int lineNumber1, out int lineNumber2)

但是,我无法想到一个算法来做到这一点。这是我的程序到目前为止所看到的:

class Book
{
    static char[] Separators = new char[] { ' ', '.', ',', '!', ':', ';', '(', ')', '\t', '\n', '\'', '"', '"' };

    public string Text { get; private set; }
    public LineContainer Lines { get; private set; }

    public string[] Words { get { return Text.Split(Separators); } }

    public Book(string[] lines)
    {
        Text = "";
        for (int i = 0; i < lines.Length; i++)
        {
            Text += lines[i] + Environment.NewLine;
        }

        Lines = new LineContainer(lines);
    }


class LineContainer
{
    private List<Line> Lines;
    public int Count { get { return Lines.Count; } }

    public LineContainer(string[] lines)
    {
        Lines = new List<Line>();
        for (int i = 0; i < lines.Length; i++)
        {
            Lines.Add(new Line(lines[i], i));
        }
    }

    public Line Get(int index)
    {
        return Lines[index];
    }
}

class Line
{
    static char[] Separators = new char[] { ' ', '.', ',', '!', ':', ';', '(', ')', '\t', '\n', '\'', '"', '"' };

    public string Text { get; private set; }
    public int Length { get { return Text.Length; } }
    public int Number { get; private set; }

    public string[] Words { get { return Text.Split(Separators); } }

    public Line(string text, int number)
    {
        Text = text;
        Number = number;
    }
}

1 个答案:

答案 0 :(得分:0)

嗯,这里有一些想法......

您可以首先使用每个文件中的字词创建2 SortedSet。这样,您可以确定哪些单词只在一个文件中。这样,您将拥有包含另一个字符串中的单词的每个序列。

之后,您可能希望构建一个字典,其中包含给定单词的所有可能的起始索引:Dictionary<string, List<int>>

然后,对于第一个字符串的每个起始单词,您可能希望找到最佳匹配。你会记得找到的最佳匹配。这样,您可以消除任何太短的序列,而不是那时最好的序列。

为此目的,有一个字典可以从起始单词给出最大长度可能会很有趣。这样,您可以轻松地消除许多序列。

可能有助于过滤的另一个技巧是建立连续对的信息。这样,也可以在一对词只存在于一个短语中的任何点切割序列。

因此,如果您在循环或递归中执行这些步骤,您将迅速消除大量案例......