您的位置:首页 > 其它

字符串全排列

2016-03-26 13:29 309 查看


输入一字符串(要求不存在重复字符),打印出该字符串中字符中字符的所有排列。

例如:输入"abc",输出结果为abc, acb, bac, bca, cab和cba。

#include <iostream>
#include <string>
using namespace std;

void swap( char *a, char *b){
char temp;
temp = *a;
*a = *b;
*b = temp;
}
void permute( char *pStr, char *pBegin);
void permute( char *pStr){
if ( pStr == NULL)
return;
permute ( pStr, pStr);
}

void permute( char *pStr, char *pBegin){
if ( *pBegin == '\0') {
cout << pStr;
} else {
for ( char *ch = pBegin ; *ch != '\0' ; ch++)
{
swap ( *ch , *pBegin);
permute ( pStr , pBegin+1);
cout <<' ';
swap ( *ch , *pBegin);   //保持初始状态
}
}
}

int main(){
cout << "请输入一列字符串:" ;
char str[10];
cin >> str;
cout << "字符全排列为:" ;
permute ( str );
cout << endl;
return 0;
}



输入一字符串(要求可以存在重复字符),打印出该字符串中字符的所有排列。

例如:输入"abb",输出结果为abb, bab, bba。

去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。

例如:“abb”,第一个字符a和第二个字符b交换,得到“bab”,此时由于第二个字符和第三个字符相同,所有第一个字符“a”不与第三个字符“b“交换。再考虑,”bab“,第二个字符和第三个字符不同,交换得”bba“,此时结束。生成全部排列
加一个判断,满足条件再进行交换

//在[nBegin,nEnd)区间中是否有字符与下标为pEnd的字符相等

bool IsSwap(char* pBegin, char* pEnd)

{

char* p;

for (p=pBegin; p<pEnd; p++)

{

if (*p == *pEnd)

return false;

}

return true;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: