题目
输入一个字符串,打印该字符串的所有排列方式。例如输入abc,打印abc、acb、bac、bca、cba、cab。
解析:该题目明显最好用递归的方式求解,先确定第一位的字符,再确定第二位的字符,依次递归下去,假如字符串长度为n,需要确定第m位的字符就依次将第m位与m之后的字符进行交换。比如:abc,可以分别将a与b、c交换,得到abc,bac,cba ,继续将abc进行递归,已经确定第一位为a,则开始确定第二位将b和c进行交换,得到acb。依次下去,最后就得到了所有的排列。
在java里面String没有交换两个字符的方法,所以得自己写一个函数
/**
* 交换字符串s中位置第a个和第b个字符。注意是从0开始。
*/
/**
* 交换字符串s中位置第a个和第b个字符。注意是从0开始。
*/
private static String changeString(String s,int a,int b){
int length=s.length();
// 输入是否合法的判断
if(a<=length&&a>=0&&b<=length&&b>=0){
// 具体的交换
char cc[]=s.toCharArray();
char ca=s.charAt(a);
char cb=s.charAt(b);
cc[a]=cb;
cc[b]=ca;
return new String(cc);
}
return s;
}
具体的递归代码如下,注释很详细。
public static void main(String[] args) {
String s="abc";
System.out.println(s);
stringArray(s, 1);//对输入的原始字符串从第二位开始交换并打印。
stringArray(s, 0); //从第一位开始交换递归交换并打印,但是这里没法对输入的原始字符串进行递归。
}
/**
* 需要对index之后的字符进行交换
*/
private static void stringArray(String s,int index){
int length=s.length();
// 将index之后的字符依次与index位置的字符进行交换
for(int i=index+1;i<length;i++)
{
// 交换index和i两个位置的字符
String s1=changeString(s, index, i);
// 打印
System.out.println(s1);
// 递归求解
stringArray(s1, index+1);
}
}