剑指Offer-28. 字符串的排列
程序员文章站
2022-03-05 13:30:06
...
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路
递归
注意,要求的是按字典序输出,并且输入字符串可能存在重复的字符,如输入为 “aa”,则输出只能有一个 “aa”。
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
char[] ctr = str.toCharArray();
ArrayList<String> res = new ArrayList<>();
res = Permutation(res, ctr, 0);
// 按字典序输出
Collections.sort(res);
return res;
}
public ArrayList<String> Permutation(ArrayList<String> res, char[] ctr, int begin) {
if (begin == ctr.length - 1) {
// res.add(Arrays.toString(ctr));
res.add(new String(ctr));
} else {
for (int i = begin; i < ctr.length; i++) {
// 可能存在重复字符
if (i == begin || ctr[i] != ctr[begin]) {
swap(ctr, i, begin);
Permutation(res, ctr, begin + 1);
swap(ctr, i, begin);
}
}
}
return res;
}
public void swap(char[] ctr, int i, int j) {
char tmp = ctr[i];
ctr[i] = ctr[j];
ctr[j] = tmp;
}
}
上一篇: Too emotional
下一篇: 剑指Offer-51. 数组中的逆序对