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 }