题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba;
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路
private ArrayList<String> result = new ArrayList<String>(); public ArrayList<String> Permutation(String str) { if (str.length() == 0){ return result; } char[] chars = str.toCharArray(); Arrays.sort(chars); //进行排序,这一步很关键 backTracking(chars,new boolean[chars.length], new StringBuffer()); return result; } private void backTracking(char[] chars,boolean[] hasUsed,StringBuffer s){ if (s.length() == chars.length) { result.add(s.toString()); //产生了新的结果 return; } for (int i = 0; i < chars.length; i++) { if (hasUsed[i]){ continue; } if (i != 0 && chars[i] == chars[i - 1] && !hasUsed[i - 1]){ continue; // 保证不重复 } hasUsed[i] = true; //标记为已经访问过 s.append(chars[i]); //加入 backTracking(chars, hasUsed, s); s.deleteCharAt(s.length() - 1); hasUsed[i] = false; } }