【演算法】字串的排列與其變式題
阿新 • • 發佈:2018-12-09
面試題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,然後用全排列的做法,每次找到一種排列就檢測一下是否在同一對角線上。
本章總結
第四章書上講了解決複雜問題的思路:畫圖、舉例、分而治之。