JZ27 - 字符串的排列
题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路:如果两个字符不同,
1、依次选用字符作为第一个;
2、在1的基础上依次选用剩下的字符做第二个;
3、以此类推…直到只剩最后一位的时候添加到集合。
“abc”:
1、a-b-c a-c-b
2、b-a-c b-c-a
3、c-b-a c-a-b
/**
* @author 枫叶火火
*/
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
//创建一个返回集合
private ArrayList<String> list = new ArrayList<String>();
public ArrayList<String> Permutation(String str) {
//对字符串中的字符进行排列
Arrange(0,str.toCharArray());
//对排列出来的集合进行排序
Collections.sort(list);
return list;
}
//排列字符串
private void Arrange(int i, char[] chs){
//如果排列到最后一位,添加到list集合中,进行返回
if(i == chs.length-1){
list.add(String.valueOf(chs));
return;
}
//逐个与i进行两两交换
for(int j = i ; j < chs.length ; j++){
//i不等于j时,并且i和j位置的字符不相等(防止abb重复计算)
if(i != j && chs[i] != chs[j] ){
//进行位置交换
swop(chs,i,j);
//往下处理
Arrange(i+1,chs);
//交换回来
swop(chs,i,j);
//i 等于 j时,直接往下处理
}else if(i == j){
Arrange(i+1,chs);
}
}
}
//交换位置
private void swop(char[] chs, int i, int j){
char temp = chs[i];
chs[i] = chs[j];
chs[j] = temp;
}
}