我正在寻找最长的常用词c#实现。我遇到的大部分样本都是按字符进行比较。
换句话说,
string1 = access
string2 = advised
应该从函数
返回null输出任何样本代码?
答案 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。