小智 6
我认为解决子集问题的最常见方法是通过地图。
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}))
}
Run Code Online (Sandbox Code Playgroud)
检查重复值的能力相对罕见。上面的代码按要求解决了问题(请参阅:http : //play.golang.org/p/4_7Oh-fgDQ)。如果您打算使用重复的值,则必须像上面的代码一样保留一个计数。如果没有重复的值,则可以通过使用布尔值(而不是整数)来更紧凑地解决问题。