zoukankan      html  css  js  c++  java
  • 字符串的全排列

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

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

  • 相关阅读:
    Java学习笔记_180706_接口实现、类继承、多态、转型
    poj 1279 求半平面交的 面积(推荐)
    半平面交 模板 poj 3335 poj 3130 poj 1474 判断半平面交是否为空集
    高斯消元 zoj 3645 poj 1222/XOR消元
    向量旋转专题
    hdu 1524 A Chess Game SG函数(有向无环图-拓扑图)博弈 (二维) + dfs(模板)
    HDOJ1079&POJ1082&ZOJ1024 Calendar Game [找规律博弈]
    转 博弈类题目小结(hdu,poj,zoj)
    poj 3080 get_next + kmp + 字符数组做函数参数 + 数组下标从1 开始
    poj Area 1265 求面积+ 多边形边上的点的个数+ 多边形内点个数
  • 原文地址:https://www.cnblogs.com/guozhenqiang/p/5428901.html
Copyright © 2011-2022 走看看