题目
输入一个字符串,打印出该字符串中字符的所有排列。
思路
- 首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换;然后固定一个字符,求后面所有字符的排列;
- 可能出现在第一个位置的字符为stringBuilder.charAt(index),index为其中任意一个字符;在固定了在index位置的一个字符后,求后面所有字符的排列,递归调用permutation(stringBuilder,index+1)
- 终止条件:当最终递归调用到index+1=length时,输出此时的stringBuilder,且由于for循环的条件,故不在进行递归调用。
- 注意:
在一个for循环内,i=1时将index为0和1的交换了,i=2时将index为0和2的交换了,为了使for循环内的调用相互不影响,在交换了字符之后应该还原。
StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
public class Q28Permutation {
public static void permutation(String string){
if (string==null||string.equals(""))
return;
StringBuilder stringBuilder=new StringBuilder(string);
int index=0;
permutation(stringBuilder,index);
}
public static void permutation(StringBuilder stringBuilder,int index){
if (index==stringBuilder.length())
System.out.println(stringBuilder);
for (int i=index;i<stringBuilder.length();i++){
char temp=stringBuilder.charAt(index);
stringBuilder.setCharAt(index,stringBuilder.charAt(i));
stringBuilder.setCharAt(i,temp);
permutation(stringBuilder,index+1);
stringBuilder.setCharAt(i,stringBuilder.charAt(index));
stringBuilder.setCharAt(index,temp);
}
}
public static void main(String[] args) {
permutation("abcdef");
}
}