字符串的全排列

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

例如:输入字符串“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代码如下:

import java.util.*;
 class Test {
      public static void pailie(StringBuilder str,int low,int high){
    	    if(high<1)                       //如果字符串长度为1,那么只有一种排列,就是本身,直接输出并结束
    	    {
    	    	System.out.println(str);
    	    	return;
    	    }
    	    if (low== high)                 //当到最后一位时,直接输出排列字符串
    	          System.out.println(str);
    	    else
    	        for (int j = low; j <= high; j++)
    	        {
    	            char ch=str.charAt(j);str.setCharAt(j,str.charAt(low));str.setCharAt(low,ch);//每一位和后面的进行交换
    	            pailie(str, low + 1, high);                                                  //求后面部分的排列
    	            ch=str.charAt(j);str.setCharAt(j,str.charAt(low));str.setCharAt(low,ch);     //求完后再交换回来
    	        }                    
      }
	}
 
public class Main {
	public static void main(String[] args) {
	  StringBuilder str=new StringBuilder("abc"); 
	  if(str.length()==0)                           //字符串为空时不求排列
		  {
		    System.out.println("不能为空");
		    return; 
		  }
	 System.out.println(str+"的全排列如下:");
	  Test.pailie(str,0,str.length()-1);
	  
	}

}

输出结果为:

abc的全排列如下:

abc
acb
bac
bca
cba
cab

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值