1. 程式人生 > >劍指Offer—字串排列

劍指Offer—字串排列

題目描述:輸入一個字串,打印出該字串中字元的所有排列。

解析:step 1:求所有可能出現第一個位置的字元。把第一個字元與後面的每個字元交換。

            step 2:固定第一個字元,將後面的字元利用遞迴進行全排列。

#include <iostream>
#include <stdio.h>
using namespace std;
void StringPermutation(char *pStr,char *pBegin);

//字串排列
void Permutation(char *pStr)
{
    if(pStr==NULL)
        return;
    StringPermutation(pStr,pStr);
}

void StringPermutation(char *pStr,char *pBegin)
{

    if(*pBegin=='\0')
        printf("%s\n",pStr);
    else
    {
        for(char* pCh=pBegin;*pCh!='\0';++pCh)
        {
            //將第一個字元與後面的字元依次置換
            char tem=*pCh;
            *pCh=*pBegin;
            *pBegin=tem;
            //遞迴遍歷後面的字元

            StringPermutation(pStr,pBegin+1);
            //遞迴完成後,將調換的字元還原。
            tem=*pBegin;
            *pBegin=*pCh;
            *pCh=tem;
        }
    }
}
//測試程式碼
void Test(char *pStr)
{
    if(pStr==NULL)
        printf("Test for NULL begins:\n");
    else
        printf("Test for %s begins:\n",pStr);

    Permutation(pStr);
    printf("\n");
}
int main()
{
    //cout << "Hello world!" << endl;
    char s1[]=" ";
    Test(s1);

    char s2[]="a";
    Test(s2);

    char s3[]="abc";
    Test(s3);
    return 0;
}