题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
回溯法:
1.将A(i=0)与后面的每一个字符(j=i,i+1,,,length-1)交换,for循环
2.首先A和A交换,swap(c,i,j);A不动,再将B(i=1)与后面的每一个交换,直到最后一个(i=length-1),即得到除A外剩下字符串的全排列:Permutation(c, i+1, array);
3.当A和A交换完毕后,再将A归位。一次循环结束
4.开始下一次A和B的交换。
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
char[] strToChar = str.toCharArray();
ArrayList<String> result = new ArrayList<String>();
if(str != null&&str.length()>0) {
Permutation(strToChar, 0,result);
Collections.sort(result);
}
return result;
}
private void Permutation(char[] c,int i,ArrayList<String> array){//将i处的字符和后面的每一位交换
if(i == c.length-1) {
String s = String.valueOf(c);
if(!array.contains(s))
array.add(s);
}else {
for(int j = i;j<c.length;j++) {
swap(c,i,j);
Permutation(c, i+1, array);
swap(c,i,j);
}
}
}
private void swap(char[] c,int i,int j) {
char temp = c[j];
c[j]=c[i];
c[i] = temp;
}
}
leetcode上n对括号有多少组合类似。
参考:牛客网-讨论