題目1:輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所
能排列出來的所有字串abc,acb,bac,bca,cab和cba
思路:劍指上的思路如下:我們求整個字串的排列,可以看成兩步。第一步求出所有可能出現在第乙個位置的所有字元,即把第乙個字元和後面的所有字元交換。第二步是固定第乙個字元,求後面所有字元的全排列。這時候我們仍然可以把後面的字元分成兩部分。即整個可以採用遞迴的思想。有點深度優先搜尋的感覺。
**:public arraylistpermutation(string str)
public void permutation(char chars, int index,treesetresult) else }}
public void swap(char c, int a,int b)
題目2:如果不是求字元的所有排列,而是求字元的所有組合,應該怎麼辦呢? 還是輸入三個字元 a、b、c,則它們的組合有 a、b、c、ab、ac、be、abc。 當交換字串中的兩個字元時,雖然能得到兩個不同的排列,但卻是同乙個組合。比如 ab 和 ba 是不同的排列,但只算乙個組合。
思路: 如果輸入 n 個字元,則這 n 個字元能構成長度為 1 的組合、長度為 2 的組合、….、長度為 n 的組合。在求 n 個字元的長度為 m ( 1<=m<=n) 的 組合的時候,我們把這 n 個字元分成兩部分:第乙個字元和其餘的所有字元。如果組合裡包含第乙個字元,則下一步在剩餘的字元裡選取 m-1個字 符:如果組合裡不包含第乙個字元,則下一步在剩餘的 n-1 個字元裡選取 m 個字元。也就是說,我們可以把求 n 個字元組成長度為 m 的組合的問題分解成兩個子問題,分別求 n-1 個字串中長度為 m-1 的組合(第乙個字元已經確定),以及求 n-1 個字元的長度為 m 的組合(第乙個字元沒有確定)。這兩個子問題都可以用遞迴的方式解決。
**:public class solution
}// 從字串s中選擇m個字元
public void perm(string s, int m, listlist,listresult)
if (s.length() != 0) }}
題目3:八皇后問題
八皇后是一道很具典型性的題目。它的基本要求是這樣的:在乙個8*8的矩陣上面放置8個物體,乙個矩陣點只允許放置乙個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上,當然也不能在一條右斜線上。
思路:以下是leetcode問題中執行最快的**。這部分有點看不懂,先留著這個問題。
**:
class solution
public void backstrace(list> result, int deep, int n,boolean col, boolean left, boolean right, int queen)else
}list.add(sb.tostring());//遍歷完每一行的列,儲存當前的queen情況
}result.add(list);
return;
}for(int i = 0;i < n; i++)
//列、左斜線、右斜線都滅有擺放皇后
queen[deep] = i;//當前行數作為下標,列作為存入陣列的數,標記該皇后的存在
col[i] = true;
left[deep + i] = true;
right[deep - i + n] = true;
backstrace(result, deep + 1, n, col, left, right, queen);
col[i] = false;
left[deep + i] = false;
right[deep - i + n] = false;}}
}
劍指38 字串的排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串 abc,則列印出由字元 a,b,c 所能排列出來的所有字串 abc,acb,bac,bca,cab 和 cba。示例 輸入 abc 輸出 abc acbbac bcacab cba有要求排序,則需要將字串所有字元取出生成等長的char...
劍指38 字串的組合 拓展
求字元的所有組合,例如輸入abc,則他們的所有組合有a b c ab ac bc abc。如果輸入n個字元,則這n個字元所構成長度為1的組合,長度為2的組合,長度為n的組合。求n個字元的長度為m 1 m n 的組合的時候,我們把這n個字元分成兩部分 第乙個字元和其餘的所有字元。如果組合中包含第乙個字...
劍指Offer 38 字串的排列
輸入乙個字串,列印出該字串中字元的所有排列。例 輸入 abc 輸出 abc acb bac cab cba 長度為n的字串的排列若是集合s,其中一種排列的字串為 s2,sn s2 sn 再插入sn 1s sn 1 則有對於乙個字串有n 1個插入位置。因此,解題思路就是每次遞迴加入乙個字元,直到字串全...