c#最长的常用词样本

时间:2010-02-19 07:36:33

标签: c# algorithm string pattern-matching

我正在寻找最长的常用词c#实现。我遇到的大部分样本都是按字符进行比较。

换句话说,

string1 = access
string2 = advised 

应该从函数

返回null输出

任何样本代码?

4 个答案:

答案 0 :(得分:2)

我认为这个问题通常被称为Longest common substring problem。维基百科文章包含伪代码,可以在Web上找到C#实现。

答案 1 :(得分:1)

如果用词来表示这些字母的东西,用标点符号与其他字母分开,试试这个:

private String longestCommonWord(String s1, String s2)
    {
        String[] seperators = new String[] { " ", ",", ".", "!", "?", ";" };
        var result = from w1 in s1.Split(seperators, StringSplitOptions.RemoveEmptyEntries)
                     where (from w2 in s2.Split(seperators, StringSplitOptions.RemoveEmptyEntries)
                            where w2 == w1
                            select w2).Count() > 0
                     orderby w1.Length descending
                     select w1;
        if (result.Count() > 0)
        {
            return result.First();
        }
        else
        {
            return null;
        }
    }

这可能不是最优雅的方式,但它对我有用。 =)

答案 2 :(得分:1)

将计算字符数组LCS的算法转换成一个对其他任何数组进行处理的算法 - 例如,一个单词数组 - 通常非常简单。你试过了吗?

如果你需要一些提示,这是我几年前写的关于如何在JScript中的单词数组上实现Longest Common Subsequence的文章。你应该能够毫不费力地将它适应C#。

http://blogs.msdn.com/ericlippert/archive/2004/07/21/189974.aspx

答案 3 :(得分:1)

查找字符串中的差异称为最长公共子序列问题。以下是用C#编写的LCS问题的通用解决方案:

static int[,] GetLCSDifferenceMatrix<T>(
    Collection<T> baseline,
    Collection<T> revision)
{
    int[,] matrix = new int[baseline.Count + 1, revision.Count + 1];

    for (int baselineIndex = 0; baselineIndex < baseline.Count; baselineIndex++)
    {
        for (int revisionIndex = 0; revisionIndex < revision.Count; revisionIndex++)
        {
            if (baseline[baselineIndex].Equals(revision[revisionIndex]))
            {
                matrix[baselineIndex + 1, revisionIndex + 1] =
                    matrix[baselineIndex, revisionIndex] + 1;
            }
            else
            {
                int possibilityOne = matrix[baselineIndex + 1, revisionIndex];
                int possibilityTwo = matrix[baselineIndex, revisionIndex + 1];

                matrix[baselineIndex + 1, revisionIndex + 1] =
                    Math.Max(possibilityOne, possibilityTwo);
            }
        }
    }

    return matrix;
}

此代码为您提供“差异”矩阵,然后可以使用该矩阵构造两个输入的差异。有关单元测试和示例用法,请参阅http://sethflowers.com/2012/01/18/basic-diff-with-a-generic-solution-to-the-longest-common-subsequence-problem.html