仅显示单词中字母的不同排列

时间:2019-05-29 20:37:40

标签: c++ backtracking

我想制作一个程序,以字母顺序显示用单词中的字母创建的所有可能的排列。问题是,当我测试带有重复字母(例如“ 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;
}

0 个答案:

没有答案