zoukankan      html  css  js  c++  java
  • 字符串全排列(permutation)

    Reference:

    http://www.cnblogs.com/sujz/archive/2011/06/16/2082831.html

    问题:给定字符串S,生成该字符串的全排列。

    方法1:依次从字符串中取出一个字符作为最终排列的第一个字符,对剩余字符组成的字符串生成全排列,最终结果为取出的字符和剩余子串全排列的组合。

     1 public static void main(String[] args) {
     2         Main so = new Main();
     3         System.out.println("method 1:");
     4         so.permutation("","ABA");
     5     }
     6     public void permutation(String prefix,String s){
     7         if(s==null||s.length()==0)
     8             System.out.println(prefix);
     9         for(int i=0;i<s.length();i++){
    10             permutation(prefix+s.charAt(i), s.substring(0, i)+s.substring(i+1,s.length()));
    11         }
    12     }

    优点:该方法易于理解,但无法移除重复的排列,如:s="ABA",会生成两个“AAB”。

    method 1:
    ABA
    AAB
    BAA
    BAA
    AAB
    ABA

    方法2:利用交换的思想,具体见实例,但该方法不如方法1容易理解。

     1 package POJ;
     2 
     3 import java.util.HashMap;
     4 
     5 public class Main {
     6 
     7     /**
     8      * 
     9      * 9.4 Write a method to compute all permutations of a string.
    10      * 
    11      * 
    12      */
    13     public static void main(String[] args) {
    14         Main so = new Main();
    15         System.out.println("method 2:");
    16         HashMap<String, Integer> hs=new HashMap<String, Integer>();
    17         so.permutation2("AABB", 0, 3,hs);
    18     }
    19 
    20     public void permutation2(String s, int startIndex, int endIndex,HashMap<String, Integer> hs) {
    21         if (startIndex == endIndex) {
    22             if(!hs.containsKey(s)){
    23                 hs.put(s, 1);
    24                 System.out.println(s);
    25             }
    26         }
    27         for (int j = startIndex; j <= endIndex; j++) {
    28             if ((s.charAt(j) == s.charAt(startIndex)) && (j != startIndex))
    29                 continue;
    30             s = swap(s, startIndex, j);
    31             permutation2(s, startIndex + 1, endIndex,hs);
    32             s = swap(s, startIndex, j);
    33         }
    34     }
    35 
    36     public String swap(String s, int i, int j) {
    37         char[] char_s = s.toCharArray();
    38 
    39         char temp = char_s[i];
    40         char_s[i] = char_s[j];
    41         char_s[j] = temp;
    42 
    43         s = String.copyValueOf(char_s);
    44         return s;
    45     }
    46 }

    运行结果:

    method 2:
    AABB
    ABAB
    ABBA
    BAAB
    BABA
    BBAA

    原Reference里的那个哥们儿的代码有点问题,他的代码用java实现后只能完成类似于ABCD,AABC等string的无重复全排列,而无法做到AABB这种类型的无重复全排列。

  • 相关阅读:
    解决-webkit-box-orient: vertical;(文本溢出)属性在webpack打包后无法编译的问题
    消息框尖尖
    表单提交
    昨天看了一个大神的fix类,清晰了然
    使用cross-env解决跨平台设置NODE_ENV的问题
    axios 在Vue全局引入的方法
    vue自定义指令
    AMD/CMD/CommonJs到底是什么?它们有什么区别?
    artDialog.js的使用
    delegate-使用笔记
  • 原文地址:https://www.cnblogs.com/Phoebe815/p/3903202.html
Copyright © 2011-2022 走看看