String 最长前缀+;字符串集合中的后缀组合

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 请注意,这不能与最长的通用前缀/后缀混淆,因为集合中只有两个或多个字符串需要共享相同的前缀+后缀。还要注意的是,前缀和后缀的长度

我有一组长度为1到30的字符串(小于30)。我需要找到至少两个共享最长前缀+后缀组合的字符串的子集

例如,设置为

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个元素的子集