1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| package main
import ( "fmt" "sort" )
func compareSubsets(a, b [][]int) bool { if len(a) != len(b) { return false }
createKey := func(s []int) string { sorted := make([]int, len(s)) copy(sorted, s) sort.Ints(sorted) return fmt.Sprintf("%v", sorted) }
counter := make(map[string]int) for _, s := range a { counter[createKey(s)]++ }
for _, s := range b { key := createKey(s) if counter[key] <= 0 { return false } counter[key]-- } return true }
func subsets(nums []int) [][]int { var result [][]int var path []int
var dfs func(int) dfs = func(start int) { result = append(result, append([]int{}, path...))
for i := start; i < len(nums); i ++ { path = append(path, nums[i]) dfs(i + 1) path = path[:len(path)-1] } }
dfs(0) return result }
func main() { testCases := []struct { nums []int expected [][]int }{ { nums: []int{1, 2, 3}, expected: [][]int{ {}, {1}, {2}, {1, 2}, {3}, {1, 3}, {2, 3}, {1, 2, 3}, }, }, { nums: []int{0}, expected: [][]int{ {}, {0}, }, }, { nums: []int{}, expected: [][]int{ {}, }, }, }
for i, tc := range testCases { fmt.Printf("Test Case %d, Input: nums = %v\n", i+1, tc.nums) result := subsets(tc.nums)
if compareSubsets(result, tc.expected) { fmt.Printf("Test Case %d, Output: %v, PASS\n", i+1, result) } else { fmt.Printf("Test Case %d, Output: %v, FAIL (Expected: %v)\n", i+1, result, tc.expected) } } }
|