含重复字符的字符串排列

问题:
给一个字符串,比如ABC, 把所有的排列,即:ABC, ACB, BAC, BCA, CAB, CBC 都找出来。

解题思路:
对于一个n 位的字符串来讲,它是n-1位字符串的排列 加上 没有在 n -1 位字符串里 那个字符 的排列。 有点难理解,用例子说明:
对于字符串ABC来讲,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。
而BC的排列是 B + C 的排列 加上 C + B 的排列。
所以,对一个字符串,我们从中去一个值,然后求剩余部分的排列,然后把它们再组合在一起。所有,代码如下:

 1 public static List<string> Permutation(string str)
 2 {
 3     List<string> list = new List<string>();
 4     if (string.IsNullOrEmpty(str)) return list;
 5 
 6     if (str.Length == 1) { list.Add(str); }
 7     else
 8     {
 9         // there are more than one characters in the string
10         for (int i = 0; i < str.Length; i++)
11         {
12             char ch = str[i];
13             //consider the case in which the characters may be duplicated.
14             if (i > 0 && ch == str[i - 1]) { continue; }
15             string newStr = Remove(str, i);
16             List<string> newStrList = Permutation(newStr);
17             for (int j = 0; j < newStrList.Count; j++)
18             {
19                 list.Add(ch + newStrList[j]);
20             }
21         }
22     }
23     return list;
24 }
25 
26 private static string Remove(string str, int i)
27 {
28     if (str.Length == 1) return string.Empty;
29 
30     if (i == 0) return str.Substring(i + 1);
31     if (i == str.Length - 1) return str.Substring(0, str.Length - 1);
32 
33     return str.Substring(0, i) + str.Substring(i + 1);
34 }

这里贴出另一个permutation 的版本

 1      public List<String> permutation(String str) {
 2         List<String> list = new ArrayList<>();
 3         if (str == null || str.length() == 0) return list;
 4         helper(0, str.toCharArray(), list);        
 5         return list;
 6     }
 7     
 8     public void helper(int index, char[] arr, List<String> list) {
 9         if (index == arr.length) {
10             list.add(new String(arr));
11             return;
12         }
13         
14         HashSet<Character> set = new HashSet<Character>();
15         for (int i = index; i < arr.length; i++) {
16             if (!set.contains(arr[i])) {
17                 set.add(arr[i]);
18                 swap(arr, i, index);
19                 helper(index + 1, arr, list);
20                 swap(arr, i, index);
21             }
22         }
23     }    

 

posted @ 2015-01-01 08:33  北叶青藤  阅读(368)  评论(0)    收藏  举报