我有一个路径列表
[]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/in/something/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/