go - 从路径列表中删除最长的公共(public)前缀

标签 go lcs

我有一个路径列表

[]string{"/a/path/to/something", "/a/path/in/something", "/a/path/in/something/else"}

我想从所有路径中删除最长公共(public)前缀,以便它的剩余部分是路径的不同部分。

对于上面的例子,结果应该是

[]string{"to/something", "in/something", "in/something/else"}

到目前为止,我的尝试相当暴力:

  1. 用“/”分割所有路径

    map["/a/path/to/something": [某物的路径], "": [某物中的路径], "/a/path/in/something/else": [某物中的路径其他东西]}

  2. 选择 map 上的任意条目并将其用作引用

  3. 迭代所选条目的单个元素,并检查该位置上的其他元素是否匹配
  4. 如果发现不匹配的元素,则序列被破坏;从 path[len(iterated_elem_so_far):]
  5. 中取出每条路径的剩余路径

是否有更复杂的方法来实现这一点?

最佳答案

你正在做的事情应该有效。不过我不明白有关 map 的部分,所以这里有一个算法,首先找到最长的前缀,然后从所有路径中删除它:

func removeLargestPrefix(in []string) []string {
   // Store split paths in results
   results:=make([][]string,0,len(in))
   // Pick the first path as the longest prefix
   results=append(results,strings.Split(in[0],"/"))
   longest:=results[0]
   // cmp shortents the known longest prefix
   cmp:=func(a []string)  {
       if len(a)<len(longest) {
         longest=longest[:len(a)]
       }
       for i:=0;i<len(longest);i++ {
          if a[i]!=longest[i] {
             longest=longest[:i]
             return
          }
       }
   }
   // process all paths
   for i:=1;i<len(in);i++ {
       r:=strings.Split(in[i],"/")
       results=append(results,r)
       cmp(r)
   }
   // here, len(longest) is the length of the longest prefix
   out:=make([]string,0,len(results))
   for _,r:=range results {
      out=append(out,strings.Join(r[len(longest):],"/"))
   }
   return out
}

关于go - 从路径列表中删除最长的公共(public)前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59606324/

相关文章:

go - 将方法添加到不同文件中的 golang 结构

go - 如何仅使用 4 位来表示 Go 中的数字?

algorithm - 了解最长公共(public)子序列算法的时间复杂度

time-complexity - 最长公共(public)子序列

go - 您可以通过 json 键字段动态迭代 Go 中的结构字段吗?

go - 如何将具有 byte slice 数据类型的结构转换为字节?

go - c.JSON gin.H{()} 输出空对象

algorithm - 最长公共(public)子序列 (LCS) 长度的 Fast(er) 算法

c++ - 为什么这个用于计算最长公共(public)子序列的并行函数比串行函数慢?

algorithm - 是否有任何算法可以解决每个字符具有不同权重的最长公共(public)子序列问题?