猿问

在 Go 中使用切片进行子集检查

我正在寻找一种有效的方法来检查一个切片是否是另一个切片的子集。我可以简单地遍历它们进行检查,但我觉得必须有更好的方法。

例如

{1, 2, 3} 是 {1, 2, 3, 4}
的子集 {1, 2, 2} 不是 {1, 2, 3, 4} 的子集

有效地做到这一点的最佳方法是什么?

谢谢!


白衣非少年
浏览 321回答 2
2回答

红颜莎娜

如果您的切片已排序,则可以完成这项工作。package mainimport "fmt"// Subset return whether a is a sublist of b. Both a and b must be (weakly) ascending.func Subset(a, b []int) bool {&nbsp; &nbsp; for len(a) > 0 {&nbsp; &nbsp; &nbsp; &nbsp; switch {&nbsp; &nbsp; &nbsp; &nbsp; case len(b) == 0:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; case a[0] == b[0]:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a = a[1:]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = b[1:]&nbsp; &nbsp; &nbsp; &nbsp; case a[0] < b[0]:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; case a[0] > b[0]:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = b[1:]&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return true}func main() {&nbsp; &nbsp; cases := []struct {&nbsp; &nbsp; &nbsp; &nbsp; a, b []int&nbsp; &nbsp; &nbsp; &nbsp; want bool&nbsp; &nbsp; }{&nbsp; &nbsp; &nbsp; &nbsp; {[]int{1, 2, 3}, []int{1, 2, 3, 4}, true},&nbsp; &nbsp; &nbsp; &nbsp; {[]int{1, 2, 2}, []int{1, 2, 3, 4}, false},&nbsp; &nbsp; }&nbsp; &nbsp; for _, c := range cases {&nbsp; &nbsp; &nbsp; &nbsp; if Subset(c.a, c.b) != c.want {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("Subset(%v, %v) = %v, want %v\n", c.a, c.b, Subset(c.a, c.b), c.want)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答