题目
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路
对题目的理解,就是一个全排列。我们可以使用暴力法对其求解。比如题目给的样例是abc,那么就有如下暴力结果:
[ aaa、aab、aac ] 、[ aba、abb、abc] 、[ aca、acb、acc] 、[ baa、bab、bac] 、[ bba、bbb、bbc] 、[ bca、bcb、bcc] 、[ caa、cab、cac] 、[ cba、cbb、cbc] 、[ cca、ccb、ccc]
这九大类。如果想要优化则可以适当剪枝,添加判断语句,在合理的位置跳出循环。
本题,我使用了暴力求解,在求解之前,我首先对str排序,这样循环下去就是按照上方书写的顺序进行。终结条件就是子字符串等于字符串或者大于字符串。由于字符串是引用,这一条路走不通记得要返回走下一条路的时候,要对子字符串还原操作。
AC代码
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
ArrayList<String> list = new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
if(str.length() == 0)
return list;
f(str,"");
return list;
}
public void f(String str, String s) {
if (s.length() == str.length()) {
char[] c1 = s.toCharArray();
Arrays.sort(c1);
char[] c2 = str.toCharArray();
Arrays.sort(c2);
String s1 = new String(c1);
String s2 = new String(c2);
if (s1.equals(s2)){
if(!list.contains(s))
list.add(s);
}
else {
return;
}
}
if(s.length() > str.length())
return ;
for (int i = 0; i < str.length(); i++) {
String t = s;
s = s + str.charAt(i);
f(str, s);
s = t;
}
}
}