含重复字符的字符串排列
问题:
给一个字符串,比如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 }

浙公网安备 33010602011771号