字符串的全排列

问题描述:输入一个字符串,打印出该字符串中字符的所有排列。

例如:输入字符串“abc”,则输出由字符a、b、c 所能排列出来的所有字符串“abc”、“acb”、“bac”、“bca”、“cab” 和“cba”。

分析:比较常见的有两种方法,

         第一种方法是可以利用字典序排列来求,这种方法编程比较复杂,读者可以查阅其他相关资料,这里不再详细解释,这种方法的时间复杂度为O(n!)。

         第二种方法是分治的思想,我们可以从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。

                 以对字符串abc进行全排列为例,我们可以这么做:

                                                                    固定a,求后面bc的排列:abc,acb,求好后,a和b交换

                                                                    固定b,求后面ac的排列:bac,bca,求好后,a和c交换

                                                                    固定c,求后面ba的排列:cba,cab。

                 由于全排列总共有n!种排列情况,所以递归算法的时间复杂度都为O(n!),这种方法编程比较简单,读者需要掌握这个方法。

                 具体的Java代码如下:

     

 1 import java.util.*;
 2  class Test {
 3       public static void pailie(StringBuilder str,int low,int high){
 4             if(high<1)                       //如果字符串长度为1,那么只有一种排列,就是本身,直接输出并结束
 5             {
 6                 System.out.println(str);
 7                 return;
 8             }
 9             if (low== high)                 //当到最后一位时,直接输出排列字符串
10                   System.out.println(str);
11             else
12                 for (int j = low; j <= high; j++)
13                 {
14                     char ch=str.charAt(j);str.setCharAt(j,str.charAt(low));str.setCharAt(low,ch);//每一位和后面的进行交换
15                     pailie(str, low + 1, high);                                                  //求后面部分的排列
16                     ch=str.charAt(j);str.setCharAt(j,str.charAt(low));str.setCharAt(low,ch);     //求完后再交换回来
17                 }                    
18       }
19     }
20  
21 public class Main {
22     public static void main(String[] args) {
23       StringBuilder str=new StringBuilder("abc"); 
24       if(str.length()==0)                           //字符串为空时不求排列
25           {
26             System.out.println("不能为空");
27             return; 
28           }
29      System.out.println(str+"的全排列如下:");
30       Test.pailie(str,0,str.length()-1);
31       
32     }
33 
34 }
View Code

输出结果为:

abc的全排列如下:
abc
acb
bac
bca
cba
cab

 

posted @ 2016-04-24 23:30  成功=坚持+努力+目标  阅读(314)  评论(0编辑  收藏  举报