1. 程式人生 > >【演算法】字串的排列與其變式題

【演算法】字串的排列與其變式題

面試題38:字串的排列

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

把第一個字元和後面所有字元交換,則第一個位置可以出現所有種字元。其中又將該字元固定,重複這個過程,即將第二個字元與後面所有字元交換。可見是一個遞迴問題。

#include<bits/stdc++.h>
using namespace std;

void Permutation(char* pStr, char* pBegin);

//求字串的排列,將其輸出 
void Permutation(char
* pStr) { if(pStr == nullptr)//僅僅多了一個非空校驗 return; Permutation(pStr, pStr); } //遞迴函式,給出大字串,給出子串首部指標(指向大字串上的當前字元) void Permutation(char* pStr, char* pBegin) { if(*pBegin == '\0') {//如果指向了'\0',說明這個字串已經排列完成了一次 printf("%s\n", pStr);//這時整個字串是一個新的排列,將其輸出 } else {//否則(沒走到結尾) //從當前位置向後的所有位置
for(char* pCh = pBegin; *pCh != '\0'; ++ pCh) { //在這每個位置上,與當前位置的字元做交換 char temp = *pCh; *pCh = *pBegin; *pBegin = temp; //然後遞迴地呼叫本函式,從下一位置開始的子串繼續做此操作 //以獲取前面部分不動,而後面子串動時候的全排列 Permutation(pStr, pBegin + 1); //在下次迴圈前將"當前位置字元"交換回到當前位置,還原現場
temp = *pCh; *pCh = *pBegin; *pBegin = temp; } } } int main() { char str[]="abcd"; Permutation(str); return 0; }

相關問題

六面體三相對面頂點和

六面體三個相對面的頂點和相等,可以畫個圖固定六面體,a[6]數組裡存的就是每個點的數字,只要對這個陣列進行全排列,然後找符合條件的排列即可。

八皇后問題

8x8棋盤上的8個皇后不同行不同列不同對角線,問有幾種擺法。

不同行,每個肯定一行,用一個數組a[8]記錄,陣列的值是列號,這樣一個數組取值就能確定一種擺法。不同行是由下標0~7自然確定的,不同列可以讓陣列初始化成0~7,然後用全排列的做法,每次找到一種排列就檢測一下是否在同一對角線上。

本章總結

第四章書上講了解決複雜問題的思路:畫圖、舉例、分而治之。