1、字串的組合【子串行】
題目:輸入乙個字串,輸出該字串中字元的所有組合。
例子:輸入:abc,它的組合有:a、b、c、ab、ac、bc、abc
分析:我們可以將字串中的每個字元看成二叉樹的乙個節點,根節點為空,每個節點都會有兩種選擇:要 和 不要 兩種選擇 。那麼我們就可以利用遞迴實現。
public
class
findmajority
char
cha =
newchar
[str.
length()
];cha = str.
tochararray()
;for
(int i =
0; ilength()
-1;i++
)else}}
public
static
void substring (
int i,string pre,
char
chars)
substring
(i+1
,pre,chars)
;substring
(i+1
,pre+string.
valueof
(chars[i]
),chars);}
// 測試
public
static
void
main
(string[
] args)
// 測試
public
static
void
main
(string[
] args)
}
2 全排列
題目:輸入乙個字串,列印出該字串中字元的所有排列。
舉例:輸入字串 abc,則輸出由字元 a、b、c 所能排列出來的所有字串 abc、acb、bac、bca、cab 和 cba。
分析:排列和上面的組合問題思想是一樣的:上面的組合問題,每個節點只有 「要」 和 「不要」 兩種選擇,而排列這裡每個節點 i 有 n - i 種選擇。
排列問題:所有的排列都是包含該字串中所有的字元,所以不需要像組合那樣利用額外的空間 pre 記錄選擇的過程。
需要注意的是:i 位置在進行選擇的時候,會先和 i + 1 位置交換位置,搞定 i + 1 後面的排列後,會再和 i + 2 ~ n - 1 位置上的每個元素交換一次,所以為了保證都是和 i 位置上的元素進行交換,每次遞迴一次後,必須要將 i 位置元素再換回原來的位置。
可以直觀的理解下:加入現在搞定 i 位置上元素,i 一共有 n - i 種選擇,每次 i 位置固定後,i + 1 ~ n - 1 位置上的元素都是同樣遞迴實現。
public
class 字串排列
char
chars = string.
tochararray()
;if(chars.length >0)
}// 對i及i以後的字元進行全排列
public
static
void
printallsort
(int i,
char
chars)
for(
int j = i; j < chars.length; j++)}
public
static
void
swap
(int i,
int j,
char
chars)
public
static
void
main
(string[
] args)
}
字串排列組合
題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。題目分析 考慮把這個複雜的問題分解成為小的問題。整個字串的排列,可以看成兩個部分 首先,求所有可能出現在第乙個位置的字元 然...
字串的排列 組合
遞迴方法 1 全排列 面試題28 字串的排列 從集合依次選出每乙個元素,作為排列的第乙個元素,然後對剩餘的元素進行全排列,如此遞迴處理 n個數的全排列,一共有n!種情況.n個位置,第乙個位置有n種,當第乙個位置固定下來之後,第二個位置有n 1種情況.全排列的過程 選擇第乙個字元 獲得第乙個字元固定下...
字串的排列組合
題目描述 輸入乙個字串,列印出該字串中字元的所有排列。基本思路 從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列,如此遞迴,從而得到所有字元的全排列。以對字元 abc 進行全排列為例,可以按下述步驟執行 將a固定在第一位,求後面bc的排列 將b固定在第一位,求後面ac的排列 將c...