字符串的全排列c++代碼實現

面試題28:字符串的排列
題目:輸入一個字符串,打印出該字符串中字符的所有排列。(假設字符串中所有字符都不相同)

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

將大問題分解爲小問題,本題思路是:把字符串看成有兩部分組成:第一部分是它的第一個字符,第二部分是後面的所有字符。
求整個字符串的排列,可以分成兩步:首先求所有可能出現在第一個位置的字符,即把第一個字符和後面的所有字符做交換。
其次是固定第一個字符,求後面所有字符的排列。這時候仍把後面的所有字符分成兩部分,後面字符的第一個字符以及這個字符之後的所有字符。

遞歸實現代碼:

#include <iostream>
#include <stdio.h>
using namespace std;

//指針pStr指向整個字符串的第一個字符,pBegin指向當前我們做排列操作的字符串的第一個字符。
//每一次遞歸的時候,從pBegin向後掃描每一個字符,在交換pCh和pBegin指向的字符之後,再對pBegin後面的字符串遞歸的做排列操作。
void Permutation(char* pStr, char* pBegin)
{
	if (*pBegin == '\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;
		}
	}
}

void Permutation(char* pStr)
{
	if (pStr == NULL)
		return;

	Permutation(pStr, pStr);
}


int main()
{
	//不能以常量字符串的形式傳進去,char* pstr1 = "abc",這種形式傳進去之後指針指向的常量字符串,在內存中位置大小不變,不能修改,只能讀不能寫操作。
	char ptr[] = "abc"; //這裏傳參數的時候要注意,如果想改變傳入的字符串,就要以字符數組的形式傳進去,這樣對數組中的內容可以操作。
	Permutation(ptr);																																							
	
	return 0;
}

程序的輸出爲:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章