1pub struct Solution;
27
28impl Solution {
29
30 pub fn subsets_with_dup(nums: Vec<i32>) -> Vec<Vec<i32>> {
32 let mut nums = nums;
33 nums.sort();
34 let mut ans = Vec::new();
35
36 backtrack(&nums[..], &mut vec![], &mut ans);
37 ans
38 }
39}
40
41fn backtrack(nums: &[i32], v: &mut Vec<i32>, ans: &mut Vec<Vec<i32>>) {
42 ans.push(v.clone());
43 for i in 0..nums.len() {
44 if i > 0 && nums[i] == nums[i - 1] {
45 continue;
46 }
47
48 v.push(nums[i]);
49 backtrack(&nums[(i + 1)..], v, ans);
50 v.pop();
51 }
52}
53
54#[cfg(test)]
55mod tests {
56 use super::*;
57
58 #[test]
59 fn test() {
60 let cases: Vec<(Vec<i32>, Vec<Vec<i32>>)> = vec![
61 (vec![1,2,2], vec![
62 vec![2],
63 vec![1],
64 vec![1,2,2,],
65 vec![2,2],
66 vec![1,2],
67 vec![],
68 ]),
69 ];
70
71 for (nums, mut expect) in cases {
72 let mut ans = Solution::subsets_with_dup(nums);
73 ans.sort();
74 expect.sort();
75 assert_eq!(expect, ans);
76 }
77 }
78}