剑指offer-字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 
思路:

把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。在图 4.14 中,我们用两种不同的背景颜色区分字符串的两部分。

我们求整个字符串的排列,可以看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。图 4.14 就是分别把第一个字符 a 和后面的 b、c 等字符交换的情形。首先固定第一个字符(如图 4.14 (a )所示〉,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换(如图 4.14 (b)所示)。。。。。。

这其实是很典型的递归思路。

public class Test {
   public static void main(String[] args) {
       char[] chars = {'a', 'a', 'c'};
       Test t = new Test();
       t.permutation(chars);
}
    public void permutation(char[] chars) {
        if(chars == null || chars.length < 1)
            return;
        permutation(chars, 0);
        
        
    }
    /**
     * 全排列
     * @param chars  待排字符串
     * @param begin      当前处理的位置
     */
   public void permutation(char[] chars, int begin) {
        // 如果是最后一个元素了,就输出排列结果
        if(begin == chars.length - 1) {
            System.out.print(new String(chars) + " ");
        } else {
            char temp;
            for(int i = begin; i < chars.length; i ++) {
                
                // 交换第n个字符与第一个字符的位置
                temp = chars[begin];
                chars[begin] = chars[i];
                chars[i] = temp;
                
                // 排列第一个字符后的所有字符
                permutation(chars, begin + 1);
                
                // 将第n个字符再与第一个字符交换过来
                temp = chars[begin];
                chars[begin] = chars[i];
                chars[i] = temp;
            }
            
        }
        
    }
   
}

 

 

posted @ 2016-08-17 15:42  no_one  阅读(167)  评论(0编辑  收藏  举报