剑指offer二十七之字符串的排列
一、题目
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
二、思路
我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。
既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排列,就是典型的递归思路了。
三、代码
import java.util.ArrayList; import java.util.Collections; public class Solution { public ArrayList<String> Permutation(String str) { //新建ArrayList,用于保存结果 ArrayList<String> list = new ArrayList<String>(); //字符串转换成字符数组 char[] ch = str.toCharArray(); //调用方法 Permu(ch, 0, list); //排序 Collections.sort(list); //返回结果 return list; } public void Permu(char[] cs, int i, ArrayList<String> list) { //如果字符串为空,直接返回 if (cs == null) { return; } if (i == cs.length - 1) { //判断一次交换是否完完成 if (!list.contains(String.valueOf(cs))) { //判断是否含有重复的字符串 list.add(String.valueOf(cs)); } } else { for (int j = i; j < cs.length; j++) { //交换 char temp = cs[j]; cs[j] = cs[i]; cs[i] = temp; //递归 Permu(cs, i + 1, list); //元素复位 temp = cs[j]; cs[j] = cs[i]; cs[i] = temp; } } } }
------------------------------------------------------
参考链接:
https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7
http://blog.csdn.net/qq_23217629/article/details/51814403