星级:1,3
1.字符串的排列
【题目】
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc, 则打印出由字符 a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
【代码】
package swear2offer.strs;
import java.util.ArrayList;
import java.util.TreeSet;
public class StrRange {
/**
* 输入一个字符串,按字典序打印出该字符串中字符的所有排列。
* 例如输入字符串 abc, 则打印出由字符 a,b,c
* 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。
*
* 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
* */
StringBuilder path = new StringBuilder();
// 使用HashSet是为了保证存储的stringBuilder不存在重复
TreeSet<String> paths = new TreeSet<>();
// 标记数组
boolean[] flag;
ArrayList<String> res = new ArrayList<>();
public ArrayList<String> Permutation(String str) {
if (str.equals("") || str == null) return res;
char[] arr = str.toCharArray();
flag = new boolean[arr.length];
All(arr,0);
res.addAll(paths);
return res;
}
/**
* 符合条件的时候返回,不符合条件的时候回溯
* */
public void All(char[] str, int len) {
// 回溯跳出条件
if (len == str.length) {
paths.add(path.toString());
return;
}
for (int i=0; i<str.length; i++) {
if (!flag[i]) {
flag[i] = true;
path.append(str[i]);
All(str,len+1);
flag[i] = false;
path.deleteCharAt(path.length(