|
@@ -1,67 +1,30 @@
|
|
|
package main
|
|
|
|
|
|
import (
|
|
|
- "fmt"
|
|
|
"sort"
|
|
|
)
|
|
|
|
|
|
-func minInt(x, y int) int {
|
|
|
- if x < y {
|
|
|
- return x
|
|
|
- }
|
|
|
- return y
|
|
|
-}
|
|
|
-
|
|
|
-// Int2DSlice ...
|
|
|
-type Int2DSlice [][]int
|
|
|
-
|
|
|
-func (p Int2DSlice) Len() int { return len(p) }
|
|
|
-func (p Int2DSlice) Less(i, j int) bool {
|
|
|
- if len(p[i]) == 0 || len(p[j]) == 0 {
|
|
|
- return len(p[i]) == 0
|
|
|
- }
|
|
|
- bound := minInt(len(p[i]), len(p[j]))
|
|
|
- for k := 0; k < bound; k++ {
|
|
|
- if p[i][k] != p[j][k] {
|
|
|
- return p[i][k] < p[j][k]
|
|
|
- }
|
|
|
- }
|
|
|
- return len(p[i]) < len(p[j])
|
|
|
-}
|
|
|
-func (p Int2DSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
|
-
|
|
|
-func subsetsWithDupIter(nums []int, subsets [][]int, subsetsMap map[string]bool) [][]int {
|
|
|
- if len(nums) == 0 {
|
|
|
- return subsets
|
|
|
- }
|
|
|
- newSubsets := [][]int{}
|
|
|
- for _, set := range subsets {
|
|
|
- newSet := append(set, nums[0])
|
|
|
- if _, ok := subsetsMap[fmt.Sprint(newSet)]; ok {
|
|
|
- continue
|
|
|
- }
|
|
|
- subsetsMap[fmt.Sprint(newSet)] = true
|
|
|
- newSubsets = append(newSubsets, newSet)
|
|
|
- }
|
|
|
- return subsetsWithDupIter(nums[1:], append(subsets, newSubsets...), subsetsMap)
|
|
|
-}
|
|
|
-
|
|
|
func subsetsWithDup(nums []int) [][]int {
|
|
|
sort.Ints(nums)
|
|
|
subsets := [][]int{[]int{}}
|
|
|
- subsetsMap := make(map[string]bool, 0)
|
|
|
- result := subsetsWithDupIter(nums, subsets, subsetsMap)
|
|
|
- sort.Sort(Int2DSlice(result))
|
|
|
- fmt.Println(subsetsMap)
|
|
|
- return result
|
|
|
-}
|
|
|
-
|
|
|
-func testSubsetsWithDup(nums []int) {
|
|
|
- subsets := subsetsWithDup(nums)
|
|
|
- fmt.Println("\nThe subsets of", nums, "is", subsets)
|
|
|
+ for i, cnt := 0, 0; i < len(nums); i += cnt {
|
|
|
+ for cnt = 1; cnt+i < len(nums) && nums[cnt+i] == nums[i]; cnt++ {
|
|
|
+ // count the number of same elements
|
|
|
+ }
|
|
|
+ preLen := len(subsets)
|
|
|
+ for j := 0; j < preLen; j++ {
|
|
|
+ subset := make([]int, len(subsets[j]))
|
|
|
+ copy(subset, subsets[j]) // deep copy, not create slice (!!!)
|
|
|
+ for k := 0; k < cnt; k++ {
|
|
|
+ subset = append(subset, nums[i])
|
|
|
+ subsets = append(subsets, subset)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return subsets
|
|
|
}
|
|
|
|
|
|
-func main() {
|
|
|
- nums := []int{1, 2, 2, 1, 2, 3, 5, 7, 2}
|
|
|
- testSubsetsWithDup(nums)
|
|
|
-}
|
|
|
+// func main() {
|
|
|
+// nums := []int{1, 2, 2, 3, 4}
|
|
|
+// fmt.Println(subsetsWithDup(nums))
|
|
|
+// }
|