最简单的方案:
bool found = false;
for(int i = Min(query.length, text.length); i >= 1; i--)
{
for(int j = 0; j <= text.length - i; j ++)
{
var part = text.Substring(j, i);
if(query.indexof(part) >= 0)
{
Console.WriteLine("MaxLength:" + i);
Console.WriteLine("Value:" + part);
found = true;
break;//也可以不跳出,可以找出所有最长的字符串,如果跳出,则只找出第一条。
}
}
if(found)
{
break;
}
}
至于KMP,未研究过。
谢谢你的回答,好高端,赞一个。。。。俄才刚开始接触c++,完全看不懂。。。呜呜
DP,类似最长公共子序列的算法,f[i][j]表示query以i为结尾,text已j为结尾满足条件的最大值,if query[i] != text[j]
f[i][j] = 0
否则f[i][j] = f[i-1][j-1] + 1,最后遍历一遍f数组,找出最大值就行了,O(N^2)
谢谢你的回答,。。。我在《算法导论》里就有这个,灰常感谢哈~~
两个O(n)的算法。
把两个串拼起来DC3构造后缀数组O(n),线性扫描SA求出height数组O(n),扫一遍height数组算LCS。
O(n)构造一个串的后缀自动机,用另一个串去跑这个SAM,记录每一步走到的距离,最远距离就是LCS。O(n)
灰常感谢哈~~
灰常感谢哈~~这个效率好高,目测回去学习《算法导论》。。。
@苗苗彬: 这个算法导论里好像没讲,最好是去看论文。
罗穗骞《后缀数组-处理字符串的有力工具》
陈立杰《NOI冬令营陈立杰讲稿》