我正在寻找一种有效的方法来检查切片是否是另一个切片的子集。我可以简单地遍历它们进行检查,但是我觉得必须有更好的方法。
例如
{1,2,3}是{1,2,3,4} 的子集{1,2,2}不是{1,2,3,4}的子集
有效执行此操作的最佳方法是什么?
谢谢!
我认为解决子集问题的最常见方法是通过地图。
package main import "fmt" // subset returns true if the first array is completely // contained in the second array. There must be at least // the same number of duplicate values in second as there // are in first. func subset(first, second []int) bool { set := make(map[int]int) for _, value := range second { set[value] += 1 } for _, value := range first { if count, found := set[value]; !found { return false } else if count < 1 { return false } else { set[value] = count - 1 } } return true } func main() { fmt.Println(subset([]int{1, 2, 3}, []int{1, 2, 3, 4})) fmt.Println(subset([]int{1, 2, 2}, []int{1, 2, 3, 4})) }
检查重复值的能力相对罕见。上面的代码按要求解决了问题(请参阅:http : //play.golang.org/p/4_7Oh-fgDQ)。如果您打算使用重复的值,则必须像上面的代码一样保留一个计数。如果没有重复的值,则可以通过使用布尔值(而不是整数)来更紧凑地解决问题。