資料結構與演算法練習 回溯 遞迴

2021-07-11 18:40:30 字數 1730 閱讀 1007

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串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 第...