我想制作一个程序,以字母顺序显示用单词中的字母创建的所有可能的排列。问题是,当我测试带有重复字母(例如“ zoom”)的某些单词时,我的程序会两次显示一些排列(在重复字母之间切换),而我却不想这么做。
解决这个问题的唯一方法是将所有排列保存在数组中,然后删除重复项。但是,这种方法在处理较大的单词时效率极低,我相信有更好的方法可以做到这一点。
#include "pch.h"
#include <iostream>
#include <cstring>
using namespace std;
int n;
char a[100], p[50], st[50];
void afisare()
{
for (int i = 1; i <= n; i++)
cout << a[st[i] - 1];
cout << endl;
}
void back(int k)
{
for (int i = 1; i <= n; i++)
if (!p[i])
{
st[k] = i;
p[i] = 1;
if (k == n) afisare();
else back(k + 1);
p[i] = 0;
}
}
int main()
{
cin.get(a, 100);
n = strlen(a);
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (a[i] > a[j])
{
char aux = a[i]; a[i] = a[j]; a[j] = aux;
}
back(1);
return 0;
}