字串的排列(全排列)——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)- 題目 31、46、47、60、77
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為例,