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"}
到目前为止,我的尝试相当残忍:
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循环的数量,但似乎没有办法解决这个问题。。。