String 最长前缀+;字符串集合中的后缀组合
我有一组长度为1到30的字符串(小于30)。我需要找到至少两个共享最长前缀+后缀组合的字符串的子集 例如,设置为String 最长前缀+;字符串集合中的后缀组合,string,algorithm,string-matching,String,Algorithm,String Matching,我有一组长度为1到30的字符串(小于30)。我需要找到至少两个共享最长前缀+后缀组合的字符串的子集 例如,设置为 Foobar Facar Faobaron Gweron Fzobar 前缀/后缀F/ar的组合长度为3,由Foobar、Facar和Fzobar共享;前缀/后缀F/obar的组合长度为5,由Foobar和Fzobar共享。搜索的前缀/后缀是F/obar 请注意,这不能与最长的通用前缀/后缀混淆,因为集合中只有两个或多个字符串需要共享相同的前缀+后缀。还要注意的是,前缀和后缀的长度
Foobar
Facar
Faobaron
Gweron
Fzobar
前缀/后缀F/ar
的组合长度为3,由Foobar
、Facar
和Fzobar
共享;前缀/后缀F/obar
的组合长度为5,由Foobar
和Fzobar
共享。搜索的前缀/后缀是F/obar
请注意,这不能与最长的通用前缀/后缀混淆,因为集合中只有两个或多个字符串需要共享相同的前缀+后缀。还要注意的是,前缀和后缀的长度之和是要最大化的,所以两者都需要考虑。前缀或后缀可以是空字符串
有人知道一种有效的方法来实现这一点吗?这个怎么样:
maxLen := -1;
for I := 0 to Len(A) - 1 do
if Len(A[I]) > maxLen then // (1)
for J := 0 to Len(A[I]) do
for K := 0 to Len(A[I]) - J do
if J+K > maxLen then // (2)
begin
prf := LeftStr(A[I], J);
suf := RightStr(A[I], K);
found := False;
for m := 0 to Len(sufList) - 1 do
if (sufList[m] = suf) and (prfList[m] = prf) then
begin
maxLen := J+K;
Result := prf+'/'+suf;
found := True;
// (3)
n := 0;
while n < Len(sufList) do
if Len(sufList[n])+Len(prfList[n]) <= maxLen then
begin
sufList.Delete(n);
prfList.Delete(n);
end
else
Inc(n);
// (end of 3)
Break;
end;
if not found then
begin
sufList.Add(suf);
prfList.Add(prf);
end;
end;
maxLen:=-1;
对于I:=0到Len(A)-1 do
如果Len(A[I])>maxLen那么//(1)
对于J:=0到Len(A[I])do
对于K:=0到Len(A[I])-jdo
如果J+K>maxLen,则/(2)
开始
prf:=LeftStr(A[I],J);
suf:=rightsr(A[I],K);
发现:=假;
对于m:=0到Len(sufList)-1 do
如果(sufList[m]=suf)和(prfList[m]=prf),则
开始
maxLen:=J+K;
结果:=prf+'/'+suf;
发现:=真;
// (3)
n:=0;
而n 如果Len(sufList[n])+Len(prfList[n]),如果希望最大化前缀+后缀,则不需要选择多于2个元素的子集