Leetcode 267: Palindrome Permutation II

Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.

For example:

Given s = "aabb", return ["abba", "baab"].

Given s = "abc", return [].

 

 1 public class Solution {
 2     public IList<string> GeneratePalindromes(string s) {
 3         var result = new List<string>();
 4         
 5         if (s == null || s.Length == 0) return result;
 6         if (s.Length == 1)
 7         {
 8             result.Add(s);
 9             return result;
10         }
11         
12         var dict = new Dictionary<char, int>();
13         for (int i = 0; i < s.Length; i++)
14         {
15             if (!dict.ContainsKey(s[i]))
16             {
17                 dict[s[i]] = 0;
18             }
19             
20             dict[s[i]]++;
21         }
22         
23         var chars = new List<char>();
24         var single = new List<char>();
25         
26         foreach (var pair in dict)
27         {
28             if (pair.Value % 2 != 0)
29             {
30                 single.Add(pair.Key);
31             }
32             
33             for (int i = 0; i < pair.Value / 2; i++)
34             {
35                 chars.Add(pair.Key);
36             }
37         }
38             
39         if (single.Count > 1) return result;
40         
41         var res = new List<string>();
42         
43         Permute(chars.ToArray(), 0, new List<char>(), res);
44         
45         foreach (var ss in res)
46         {
47             result.Add(single.Count == 1 ? ss + single[0] + ReverseString(ss) : ss + ReverseString(ss));
48         }
49         
50         return result;
51     }
52     
53     public string ReverseString(string s)
54     {
55         char[] arr = s.ToCharArray();
56         Array.Reverse(arr);
57         return new string(arr);
58     }
59     
60     private void Permute(char[] s, int start, IList<char> cur, IList<string> result)
61     {
62         if (start >= s.Length)
63         {
64             var sb = new StringBuilder();
65             
66             foreach (char c in cur)
67             {
68                 sb.Append(c);
69             }
70             
71             result.Add(sb.ToString());
72             
73             return;
74         }
75         
76         var used = new HashSet<char>();
77         for (int i = start; i < s.Length; i++)
78         {
79             if (!used.Contains(s[i]))
80             {
81                 used.Add(s[i]);
82                 
83                 cur.Add(s[i]);
84 
85                 var tmp = s[start];
86                 s[start] = s[i];
87                 s[i] = tmp;
88 
89                 Permute(s, start + 1, cur, result);
90                 
91                 tmp = s[start];
92                 s[start] = s[i];
93                 s[i] = tmp;
94 
95                 cur.RemoveAt(cur.Count - 1);
96             }
97         }
98     }
99 }

 

转载于:https://www.cnblogs.com/liangmou/p/8070692.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值