程序员面试题100题第28题——全排列
生活随笔
收集整理的這篇文章主要介紹了
程序员面试题100题第28题——全排列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
輸入一字符串,輸出字符串的所有排列
分析:
我們以三個字符abc為例。首先我們固定第一個字符a,求后面兩個字符bc的全排列。當bc的排列求好之后,這就是一部分解;
現在我們把第一個字符a和后面的字符b交換得到bac,固定第一個字符b,求后面兩個字符ac的全排列。當ac的排列求好之后,這是另外一部分解;
接著我們該把c放在第一個位置了,為了確保這次c是和原先處于第一位置的a交換,必須把b和a交換回來,得到abc,然后再把c交換到第一位置得到cba,固定第一個字符c,求后面兩個字符ba的全排列。當ba的排列求好之后,這是另外一部分解;
三部分解組成所有的解。
?
又如abcd
abcd
a{bcd的排列}//得到部分解
abcd?//進入下一次循環保證字符交換回來
↓ ? ??
abcd
bacd
b{acd的排列}//得到部分解
abcd?//進入下一次循環保證字符交換回來
↓ ? ??
abcd
cbad
c{bad的排列}//得到部分解
abcd?//進入下一次循環保證字符交換回來
↓ ? ?
abcd
dbca
d{bcd的排列}//得到部分解
abcd?//進入下一次循環保證字符交換回來
?
下面是代碼:
void Permutation(char* pStr, char* pBegin) {if(pStr==NULL || pBegin==NULL)return ;if(*pBegin == '\0'){printf("%s\n",pStr);//%s 輸出整個字符串}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;}} } void Permutation(char* pStr) {Permutation(pStr, pStr); }??
轉載于:https://www.cnblogs.com/zjhnl/archive/2012/10/01/2709878.html
總結
以上是生活随笔為你收集整理的程序员面试题100题第28题——全排列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net C# 计算运算耗时时间
- 下一篇: 实验5 OpenGL模型视图变换