字串的排列

2021-09-06 12:34:21 字數 1336 閱讀 1359

題目:輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印出字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab、cba。

求整個字串的排列,可以看成兩步

首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。下圖就是分別把第乙個字元a和後面b、c等字元交換的情形。

第二步固定第乙個字元(如圖a所示),求後面所有字元的排列。這個時候我們仍把後面的所有字元分成兩部分:後面字元的第乙個字元,以及這個字元之後的所有字元。然後把第乙個字元逐一和它後面的字元交換(如圖b所示)。。。

分析到這裡,其實可以看出,這就是很典型的遞迴思路

實現**如下:

void permutation(char* pstr)

void permutation(char* pstr, char* pbegin)

else}}

在函式permutation(char* pstr, char* pbegin)中,指標pstr指向整個字串的第乙個字元,pbegin指向當前我們做排列操作的字串的第乙個字元。在每一次遞迴的時候,我們從pbegin向後掃瞄每乙個字元(即指標pch指向的字元)。在交換pbegin和pch指向的字元之後,我們再對pbegin後面的字元遞迴地做排列操作,直至pbegin指向字串的末尾。

測試**如下:

#includevoid permutation(char* pstr, char* pbegin);

void permutation(char* pstr)

void permutation(char* pstr, char* pbegin)

else

}}// ********************測試**********************

void test(char* pstr)

int main(int argc, char* argv)

擴充套件1:如果不是求字元的所有排列,而是求字元的所有組合,應該怎麼辦呢?當輸入的字串中含有相同的字串時,相同的字元交換位置是不同的排列,但是同乙個組合。舉個例子,如果輸入abc,它的組合有a、b、c、ab、ac、bc、abc

。(字串的組合)

擴充套件2:輸入乙個含有8個數字的陣列,判斷有沒有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和相等。

字串排列

在網上看到了乙個操作字串的題目,該題為 字串排列。大概意思是列出字串中所有字元的所有組合並且輸出無重複。自己做了一下,這裡分享該題的思路,和做法。自我覺得實現的有些麻煩 歡迎指點。問題輸入乙個字串,列印出該字串中字元的所有排列。輸入 字串abc。輸出 列印出由字元a,b,c所能排列出來的所有字串ab...

字串排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。第一種方法 字串拼接 function permutate str else return result console.log pe...

字串的排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串 abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和 cba。分析 這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試 筆試題中。我們以三個字元 abc為例來分析...