全排列问题
输入一个字符串,打印出该字符串中字符的所有排列。
例如:输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路:
把一个字符串看成两部分组成:第一部分为第一个字符,第二部分为后面的所有字符。
求整个字符串的排列,可以看出两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换;然后固定第一个字符,求后面所有字符的排序。此时仍把后面的字符看成两部分,第一个字符和后面的字符,然后重复上述步骤。(递归)
在后面的在线测试中,要求输入字符串可能有重复的字符,输出按照字典顺序。
//字符串的全排列
//1. 把第一个字符与后面的所有字符进行交换。
//2. 固定第一个字符,将第二个字符与后面字符进行交换。
//3. 重复2操作,第一字符后移,将其交换
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//去掉重复的全排列
//在[nBegin,nEnd)区间中是否有字符与下标为pEnd的字符相等
bool IsSwap(char* pBegin, char* pEnd)
{
char *p;
for (p = pBegin; p < pEnd; p++)
{
if (*p == *pEnd)
return false;
}
return true;
}
void sawp(char* s1, char* s2)
{
char temp = *s1;
*s1 = *s2;
*s2 = temp;
}
void Permutation(char* pstr, char* pBegin)
{
if (*pBegin == '\0') {
static int num = 0;
num++;
cout << "第" << num << "个全排列" << pstr << endl;
//printf("%s\n", pstr);
}
else {
for (char* pCh = pBegin; *pCh != '\0'; ++pCh)
{
if (IsSwap(pBegin, pCh)) {
sawp(pBegin, pCh);
Permutation(pstr, pBegin + 1);
sawp(pBegin, pCh);
}
}
}
}
void permutation(char *str)
{
if (str == NULL)
{
return;
}
Permutation(str, str);
}
int main()
{
char a[64];
int n;
cin >> a;
n = strlen(a) - 1;
permutation(a);
system("pause");
return 0;
}