CVTE筆試題 字串的全排列

2021-07-28 23:23:22 字數 1179 閱讀 5690

下面我就程式設計題–字串的全排列進行總結;

當然,這道題在劍指offer上就有,面試經常出,我以前也做過,但是時間長了,不太熟了,做的時候挺吃力,就在這裡總結一下吧!

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

解法一:遞迴

就是常見的遞迴的解法,先固定第乙個位置的字元,然後排列後面的字元,然後和第二個字元交換,將第二個字元固定在第乙個位置,排列後面的字元,依次類推,就排列出了所有組合,其實就是個遞迴的問題,大問題不停的劃分為子問題;

abc為例:

1> 固定a,對bc進行排列,我們又可以把bc當做乙個子問題,固定b,對c進行排列,c已經不能再分了,那就列印出abc;

2>又回到了b,b和下乙個位置進行交換,即變為cb,在bc這個子問題中,該讓c變為第乙個字元了,遞迴得到acb;

2>又回到了b,但是此時是c為第乙個,所以我們需要,將b和c的位置換回去,因為當退回到a的時候,或者c後面還有d的時候,我們需要d固定到b的位置,bc進行排列,如果不換回bc的位置,那麼不會得到預期的結果,返回a時也一樣,如果不把bc換回bc那麼回到a之後,替換第乙個位置的字元就變為了 c,此時字串是cab, 那麼又對ab進行排列,最後變為ba, 如果不換回位置的話,等返回到c的時候就變為了 cba, 那麼此時該把第三個字串固定到第乙個位置了,豈不是又變成了abc?

所以,每次交換位置進行遞迴之後,需要還原位置;

文字描述比較抽象一點,需要自己進行在本子上一步步的推理,才能理解;

主要**邏輯如下:

void printr(char* str,int start, int len)

else

}}void print(char* str)

–解法二:

熟悉stl的話,你可以在stl裡找到乙個next_permutation 函式;

如果你輸入一段字串(注意,引數其實是迭代器),那麼它會按返回這個字串的下乙個組合,但是必須是有序的,所以使用之前我們得排一次序,也就說明了使用的限制。具體解釋看stl原始碼剖析p380;

使用如下:

void print(char *str)

while(next_permutation(str,str+len));

}

演算法題 字串的全排列

問題 編寫乙個函式,用它把字串中所有的字元的各種排列形式全部顯示出來,即用給定字元做全排列。如 比如給定字串 hat 函式輸出全排列 tha,aht,tah,ath,hta,hat.演算法如下 void dopermute char in,char out,int used,int length,i...

OJ題 字串的排列 全排列問題

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則按字典序列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。解法一 c 中本身有全排列的函式 next permutation 標頭檔案函式原型 bool next permu...

筆試題 字串翻轉 python

將一句話的單詞進行倒置,標點不倒置。比如 i like beijing.經過函式後變為 beijing.like i 輸入描述 每個測試輸入包含1個測試用例 i like beijing.輸入用例長度不超過100 輸出描述 依次輸出倒置之後的字串,以空格分割 輸入例子 i like beijing....