剑指offer(27)字符串的排列
题目描述:入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路描述:递归思想:将字符串化为char类型的数组,如果只有一个字符,则直接输出,否则从第一个字符开始,每次与第一个字符串进行交换,剩余字符串依次与子串中的第一个字符串进行交换,直到最后一个字符,返回结果。每次交换后,都要再次交换过来,保证下次交换的正确性。
代码:
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> result =new ArrayList<String>();
if(str == null || str.length() == 0)
return result;
char [] ch = str.toCharArray();
TreeSet<String> temp = new TreeSet<>();//treeset用来保证结果不重复,并保持字典序
PrintAll(ch, 0, temp);
result.addAll(temp);
return result;
}
public static void PrintAll(char[] ch, int start, TreeSet<String> temp){
if(ch == null || ch.length == 0||start < 0|| start > ch.length -1)
return;
if(start == ch.length - 1)
temp.add(String.valueOf(ch));
for(int i = start; i <= ch.length - 1;i++){
swap(ch,start,i);
PrintAll(ch,start + 1,temp);
swap(ch,start,i);//交换回去,保证正确性
}
}
public static void swap(char[] ch, int a, int b){
char temp = ch[a];
ch[a] = ch[b];
ch[b] = temp;
}
}