字串排列組合

2021-10-08 08:52:08 字數 1933 閱讀 5300

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...