字符串全排列的遞歸實現

#include "stdafx.h"
#include <iostream>
#include <assert.h>
using namespace std;

void permutation(char *pStr, char* pBegin)
{
    assert(pStr&&pBegin);
    if (*pBegin == '\0')
        cout << pStr << endl;
    else
    {
        for (char* pCh = pBegin; *pCh != '\0'; ++pCh)
        {
            swap(*pBegin, *pCh);
            permutation(pStr, pBegin + 1);
            swap(*pBegin, *pCh);
        }
    }
}

int main()
{
    char str[] = "abcd";
    permutation(str, str);
}
  1. 這是在源字符串上的操作,因此,swap之後還需要再次swap回來以恢復。
  2. 最終結果是分組的
    • a開頭,後面跟三個字符
    • b開頭,後面跟三個字符
    • c開頭,後面跟三個字符
    • d開頭,後面跟三個字符
      先將一個字符a和後面的一個字符交換後,只需要再對後三個字符遞歸調用當前函數即可
  3. 遞歸的推出條件就是字符串爲空*pBegin == '\0'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章