一、题目
题目描述:
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则打印出由字符 a,b,c 所能排列出来的所有字符串 abc,acb,bac,bca,cab 和 cba。
输入描述:
输入一个字符串,长度不超过 9 (可能有字符重复),字符只包括大小写字母。
二、分析及代码
1. 回溯
(1)思路
结合回溯方法,对所有可能的排列通过递归进行尝试。
(2)代码
import java.util.Collections;
import java.util.ArrayList;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> ans = new ArrayList<>();
if (str.length() == 0)
return ans;
permutation(str.toCharArray(), 0, ans);
Collections.sort(ans);
return ans;
}
public void permutation(char[] c, int i, ArrayList<String> ans) {
if (i == c.length - 1) {
String ansStr = String.valueOf(c);
if (!ans.contains(ansStr))
ans.add(ansStr);
return;
}
for (int j = i; j < c.length; j++) {
if (i == j || c[i] != c[j]) {
swap(c, i, j);
permutation(c, i + 1, ans);
swap(c, i, j);
}
}
}
public void swap(char[] c, int a, int b) {
char temp = c[a];
c[a] = c[b];
c[b] = temp;
}
}
(3)结果
运行时间:131ms,占用内存:11712。
三、其他
暂无。