輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。 (輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。)
i個字母的排列組合和i+1個字母的排列組合問題近乎一致,所以可以通過遞迴來解決。同時i個字母的排列組合和i+1個字母排列之間又存在關係,通過回溯法列舉出所有方式,然後通過set結構體的特性去重,再按照字母順序排列
private boolean has;
private
char result;
private hashsetset = new hashset();
//dfs
private
void
fillchar(char chars, int n)
for (int i = 0; i < chars.length; i++) }}
public arraylistpermutation(string str)
has = new boolean[length];
result = new
char[length];
char chars = str.tochararray();
fillchar(chars, 0);
list.addall(set);
collections.sort(list);
return list;
}
public
void
testpermutation()
從第一行開始,i表示行數,j表示列數(1<=i,j<=8)
第1行 j的位置可為任意
第2行 j的位置取決第1行
第3行 j的位置取決於第1和第2行
第i行的可擺放位置,取決於i-1行的棋子擺放
由此可以遞迴處理。然後再逐行遍歷迴圈
// 8行8列
public
final
static
int max = 8;
/** 儲存總共有多少種解法 */
public
static
int count = 0;
// 從1開始計數,儲存1表示這個位置是乙個合法位置,0表示不是乙個合法位置。因為種解法每一行只有乙個1,第0列用來儲存只有乙個1的座標位置
private
int matrix = new
int[max + 1][max + 1];
/*** 判斷座標(i,j)是不是乙個可用位置
*/public
boolean
islegal(int j, int i)
}return
true;
}/**
* 列印解法
*/public
void
printmatrix()
system.out.println();}}
/*** 填充棋子
*/public
void
fill(int i) else
matrix[i][m] = 0;}}
}
public
void
testfill()
資料結構與演算法 遞迴和回溯
理論 遞迴函式在執行乙個任務時,需要呼叫函式自身來完成一些子任務。在某些時候,函式不需要繼續呼叫函式自身就可以完成當前子任務。函式不再遞迴的情況稱作基本情形 base case,也稱為基本情況 而函式呼叫自身來執行子任務的情況就稱作遞迴情形 recursive case 形式描述 舉例 理論 每次遞...
Java資料結構與演算法 遞迴和回溯
任何呼叫自身的函式成為遞迴。遞迴是從跟數學領域借鑑過來的一種有用的技術,遞迴 通常比迭代 更加簡潔易懂。以階乘喂例,其遞迴定義如下 n 1 n 0 n n n 1 n 0 複製 實現 public static void main string args static int fact int n ...
資料結構與演算法之遞迴(回溯)
問題介紹 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即 任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。演算法思路分析 1 第乙個皇后先放第一行第一列 2 第...