演算法筆記_025:字串的全排列(Java)

來源:互聯網
上載者:User

標籤:cti   方法   判斷   array   string   bool   pre   lib   boolean   

目錄

1 問題描述

2 解決方案

2.1 遞迴實現

2.2 字典序排列實現

  1 問題描述

輸入一個字串,列印出該字串的所有排列。例如,輸入字串”abc”,則輸出有字元’a’,’b’,’c’所能排列出來的所有字串”abc”,”acb”,”bac”,”bca”,”cab”,”cba”。

  2 解決方案 2.1 遞迴實現

從字串中選出一個字元作為排列的第一個字元,然後對剩餘的字元進行全排列。如此遞迴處理,從而得到所有字元的全排列。

具體代碼如下:

package com.liuzhen.string_1;public class StringArrange {//方法1:遞迴實現    /*     * 參數arrayA:給定字串的字元數組     * 參數start:開始遍曆字元與其後面各個字元將要進行交換的位置     * 參數end:字串數組的最後一位     * 函數功能:輸出字串數位各個字元全排列     */    public void recursionArrange(char[] arrayA,int start,int end){        if(end <= 1)            return;        if(start == end){            for(int i = 0;i < arrayA.length;i++)                System.out.print(arrayA[i]);            System.out.println();        }        else{            for(int i = start;i <= end;i++){                swap(arrayA,i,start);                recursionArrange(arrayA,start+1,end);                swap(arrayA,i,start);            }        }            }    //交換數組m位置和n位置上的值    public void swap(char[] arrayA,int m,int n){        char temp = arrayA[m];        arrayA[m] = arrayA[n];        arrayA[n] = temp;    }        public static void main(String[] args){        StringArrange test = new StringArrange();        String A = "abc";        char[] arrayA = A.toCharArray();        test.recursionArrange(arrayA,0,arrayA.length-1);    }}

運行結果:

abcacbbacbcacbacab

 

2.2 字典序排列實現

思想如下:

(1)找到排列中最後(最右)一個升序的首位位置i。

(2)找到排列中第i位右邊最後一個比ai大的位置j。

(3)交換ai和aj的值。

(4)把第i+1位到最後一位的部分進行逆序反轉。

具體代碼如下:

package com.liuzhen.string_1;public class StringArrange {    //方法2:字典序排列    /*     * 參數arrayA:給定字串的字元數組     * 函數功能:輸出字串數組的所有字元的字典序全排列     */    public void dictionaryArrange(char[] arrayA){        System.out.println(String.valueOf(arrayA));        while(allArrange(arrayA))            System.out.println(String.valueOf(arrayA));    }    //判斷當前數組arrayA序列是否可以進行字典序排列,如可以則進行排列並返回true,否則返回false    public boolean allArrange(char[] arrayA){        int i;        for(i = arrayA.length-2;(i >= 0) && arrayA[i] > arrayA[i+1];--i);        if(i < 0)            return false;        int k;        for(k = arrayA.length-1;(k > i) && arrayA[i] >= arrayA[k];--k);        swap(arrayA,i,k);        reverseArray(arrayA,i+1,arrayA.length-1);        return true;    }    //將數組中a[m]到a[n]一段元素反序排列    public void reverseArray(char[] arrayN,int m,int n){        while(m < n){            char temp = arrayN[m];            arrayN[m++] = arrayN[n];            arrayN[n--] = temp;        }    }    //交換數組m位置和n位置上的值    public void swap(char[] arrayA,int m,int n){        char temp = arrayA[m];        arrayA[m] = arrayA[n];        arrayA[n] = temp;    }
public static void main(String[] args){ StringArrange test = new StringArrange(); String A = "abc"; char[] arrayA = A.toCharArray(); test.dictionaryArrange(arrayA); }}

 運行結果:

abcacbbacbcacabcba

 

演算法筆記_025:字串的全排列(Java)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.