1. 程式人生 > >字串的排列(全排列)——Java、回溯法

字串的排列(全排列)——Java、回溯法

題目描述

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

輸入描述:

輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

Solution:


從這張圖中,我們可以看出來,找全排列類似於深度優先遍歷,深度優先最關鍵的就是要記住上一個狀態,而所謂回溯就是要回到上一沒有操作過的狀態,再去考慮別的情況。

例如上面這個圖,我們的想法是每次都把一個數固定在前面,讓後面的數遞迴地進行全排列,這樣每個數都固定過以後就能找出所有排列。關鍵的地方在於,我們把每個數固定在前面並讓後面的進行全排列完畢以後,要恢復原來的狀態,也就需要交換回來。

具體的程式碼如下:

import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
       ArrayList<String> ans=new ArrayList<>();//所有排列的可能都在這裡
        if(str!=null||str.length()>0){
            help(0,str.toCharArray(),ans);
            Collections.sort(ans);
        }
        
        return ans;
    }
    public static void help(int i,char[] cha,ArrayList<String> ans){
        if(i==cha.length-1){
            String val = String.valueOf(cha);
            if(!ans.contains(val)){
                ans.add(val);
            }
        }else{
            for(int j=i;j<cha.length;j++){
                swap(i,j,cha);//依次選一個數固定住
                help(i+1,cha,ans);//讓後面的進行全排列
                swap(i,j,cha);//恢復原來的模樣,回溯關鍵
            }
        }
        
    }
    public static void swap(int i,int j,char[] cha){
        char temp=cha[i];
        cha[i]=cha[j];
        cha[j]=temp;
    }
    
}

相關推薦

字串排列排列——Java回溯

題目描述輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。輸入描述:輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。Solution:從這張

藍橋杯往屆試題:帶分數排列java

問題描述100 可以表示為帶分數的形式:100 = 3 + 69258 / 714。還可以表示為:100 = 82 + 3546 / 197。注意特徵:帶分數中,數字1~9分別出現且只出現一次(不包含0)。類似這樣的帶分數,100 有 11 種表示法。輸入格式從標準輸入讀入一

LeetCode - Permutations排列康託展開 Cantor expansion- 題目 3146476077

31. Next Permutation 46. Permutations 47. Permutations II 60. Permutation Sequence 77. Combinations 這五道題是LeetCode上關於數列的全

劍指Offer.38 字串排列包含重複

題目給定字串“abca”輸出其全部排列。分析:package 劍指Offer; import java.util.ArrayList; import java.util.List; public c

演算法思維遞迴訓練:輸出字串字元的排列

題目 設計一個演算法,輸出一個字串字元的全排列。 比如,String = “ABC” 輸出是 ABC ACB BAC BCA CBA CAB 思路 可能我們的第一直覺是,這就是一個選擇問題,第一個字

排列洛谷1061 Jam的計數or NOIP 2006 普及組 第三題

div 順序 pre highlight 格式 其中 字符 是個 true Jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文字母計數,他覺得這樣做,會使世界更加豐富多彩。 在他的計數法中,每個數字的位數都是相同的(使用相同個數的字母),英文字母按

數列還原排列

for rip 幫助 個數字 item [0 str pan subject 題目描述 牛牛的作業薄上有一個長度為 n 的排列 A,這個排列包含了從1到n的n個數,但是因為一些原因,其中有一些位置(不超過 10 個)看不清了,但是牛牛記得這個數列順序對的數量是 k,順序對是

習題2.8 輸出排列20 分浙大版《數據結構第2版》題目集

text ble 存在 base scripts html 數據 ext 運行時 請編寫程序輸出前n個正整數的全排列(n<10),並通過9個測試用例(即n從1到9)觀察n逐步增大時程序的運行時間。 輸入格式: 輸入給出正整數n(<10)。 輸出格

HDU 5727 Necklace排列+二分圖匹配

color algorithm target () mark ++ int turn open http://acm.split.hdu.edu.cn/showproblem.php?pid=5727 題意:現在有n個陽珠子和n個陰珠子,現在要把它們串成項鏈,要求是陰陽珠

9-----輸出排列遞歸

inpu 遞歸 col acc end return item AC urn 1、題目:給定一個字符串,輸出所有的字典序。 如: 輸入字符串:‘ac‘,輸出:[‘ac‘,‘ca‘] 輸入字符串:‘abc‘ ,輸出:[‘abc‘,‘acb‘,‘bac‘,‘bca‘,‘cab‘

深度搜索優先排列

public tint 判斷 auto pack get private 輸入一個數 ring package Mypackage; import java.util.Scanner; public class 全排列{ static int a[]=new

TOJ 1344 速算24點排列+dfs

i++ ace family lse pre == ott != 結果 描述 速算24點相信絕大多數人都玩過。就是隨機給你四張牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用‘+‘,‘-‘,‘*‘,‘/‘運算符以及括號改

遞迴:排列實力蒙

#include <iostream> using namespace std; void swap(int &a,int &b) {  int temp=a;   a=b;   b=temp; } void pai_xu(int a[]

斐波那契+n的k次方+整數各位之和+字串反向排列逆置+實現strlen函式+n的階乘+列印整數的每一位

用兩種方法求斐波那契數列指定數值 #include <stdio.h> #include <windows.h> //用遞迴實現斐波那契數列 int fib(int n) { if (n == 1 || n == 2) { return 1; } re

Generating Fast排列函式

Generating permutation has always been an important problem in computer science. In this problem you will have to generate the permutation of a gi

洛谷 P1088 火星人 排列

直接呼叫next_permutation即可,向前的話可以呼叫prev_permutation #include<cstdio> #include<cctype> #inclu

排列 P1088 火星人

題目描述 人類終於登上了火星的土地並且見到了神祕的火星人。人類和火星人都無法理解對方的語言,但是我們的科學家發明了一種用數字交流的方法。這種交流方法是這樣的,首先,火星人把一個非常大的數字告訴人類科學家,科學家破解這個數字的含義後,再把一個很小的數字加到這個大數上面,把結果

E. Stack Sorting Codeforces排列與棧輔助排序

Educational Codeforces Round 35 (Rated for Div. 2) E. Stack Sorting time limit per test 2 seconds memory limit per test 256 megaby

下一排列問題排列暴力

A Number PuzzleTime Limit: 1000 ms /Memory Limit: 32768 kbDescriptionLele 最近上課的時候都很無聊,所以他發明了一個數字遊戲來打發時間。這個遊戲是這樣的,首先,他拿出幾張紙片,分別寫上0到9之間的任意數字

紫書第七章-----暴力求解法排列演算法

遞迴求全排列 /* 本程式是遞迴實現全排列演算法。 思想是分別讓誰打頭。以1,2,3,4為例,一共只有4位, 第一位可以分別讓1,2,3,4打頭,以第一位是1為例, 第二位可以分別讓2,3,4打頭,以第二位是2為例,