gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:11:51 25 4
gpt4 key购买 nike

我有一个路径列表

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

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

对于上面的例子,结果应该是
[]string{"to/something", "in/something", "in/something/else"}

到目前为止,我的尝试是相当蛮力的:
  • 用“/”分割所有路径

    map["/a/path/to/something": [a path to something], "": [a path in something], "/a/path/in/something/else": [a path in else] }
  • 选择 map 的任何条目并将其用作引用
  • 遍历所选条目的单个元素并检查该位置上的其他元素是否匹配
  • 如果找到不匹配的元素,则序列被破坏;从path[len(iterated_elem_so_far):]取每条路径的剩余路径

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

    最佳答案

    你在做什么应该工作。不过我不了解 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com