Go 从路径列表中删除最长的公共前缀

Go 从路径列表中删除最长的公共前缀,go,lcs,Go,Lcs,我有一个路径列表 []string{"/a/path/to/something", "/a/path/in/something", "/a/path/in/something/else"} 我想从所有路径中删除最长的公共前缀,使其剩余部分成为路径的不同部分 对于上述示例,结果应为 []string{"to/something", "in/something", "in/something/else"} 到目前为止,我的尝试相当残忍: 按“/”分割所有路径 映射[“/a/path/to/som

我有一个路径列表

[]string{"/a/path/to/something", "/a/path/in/something", "/a/path/in/something/else"}
我想从所有路径中删除最长的公共前缀,使其剩余部分成为路径的不同部分

对于上述示例,结果应为

[]string{"to/something", "in/something", "in/something/else"}
到目前为止,我的尝试相当残忍:

  • 按“/”分割所有路径

    映射[“/a/path/to/something”:[某物的路径],“:[某物中的路径],“/a/path/in/something/else”:[其他某物中的路径]}

  • 选择地图的任何条目并将其用作参考

  • 迭代选中条目的单个元素,并检查该位置上的其他元素是否匹配
  • 如果发现一个不匹配的元素,则序列被破坏;从
    path[len(迭代元素到目前为止):]中获取每个路径的剩余路径。

  • 有没有更复杂的方法来实现这一点?

    你所做的应该是可行的。但是我不理解地图的部分,所以这里有一个算法,首先找到最长的前缀,然后从所有路径中删除它:

    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
    }
    
    
    func removeLargestPrefix(在[]字符串中)[]字符串{
    //在结果中存储分割路径
    结果:=make([]字符串,0,len(in))
    //选择第一条路径作为最长前缀
    结果=追加(结果,字符串.Split(在[0],“/”)中)
    最长:=结果[0]
    //cmp缩短已知的最长前缀
    cmp:=func(一个[]字符串){
    
    如果len(a)Code是正确的。我只是说了一句话。您实际上不需要定义cmp函数。您可以替换对cmp(r)的调用
    对于
    cmp
    函数的主体,是的,这也是我大致想到的;困扰我的是所需for循环的数量,但似乎没有办法解决这个问题。。。