字符串的全排列
问题描述:输入一个字符串,打印出该字符串中字符的所有排列。
例如:输入字符串“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 }
输出结果为:
abc的全排列如下:
abc
acb
bac
bca
cba
cab