c++ - 堆在 C++ 中的算法重复?

标签 c++ algorithm permutation repeat heaps-algorithm

我正在尝试用 C++ 实现 Heap 的算法。
但是,如果要置换的字符串的长度达到 4,算法就会开始重复。代码如下:

void permute(int n, string str, int *total,string array[]){

    if (n==0){
        
        array[*total] = str;
        *total += 1;
    
    }

    else{
    
        for(int c=0; c<=n;c++){
            
            permute(n-1,str,total, array);
            if (n % 2 == 0){
                char tmpstr=str[c];
                str[c]=str[n];
                str[n]=tmpstr; 
                }
            else{
                char tmpstr=str[0];
                str[0]=str[n];
                str[n]=tmpstr;
            }
        }
    }
}

int main() {
    int total = 0;
    string array[24];
    permute(3,"abcd",&total, array);
    cout << total << endl;
    return 0;
}

这是输出。它在第 13 行重复

24
abcd
bacd
cbad
bcad
cabd
acbd
dbca
bdca
cbda
bcda
cdba
dcba
abcd <-- right here
bacd
cbad
bcad
cabd
acbd
dbca
bdca
cbda
bcda
cdba
dcba

谢谢你们,欢迎任何帮助!

最佳答案

虽然使用 PaulMcKenzie 推荐的标准函数总是一个绝妙的主意,但您已经发布了一个代码,其中包含一个问题,即为什么它不起作用。

在你的 for 循环中,删除行 if (n%2 ==0) 及其 else 部分:

  for(int c=0; c<=n;c++){
        permute(n-1,str,total, array);
        char tmpstr=str[c];
        str[c]=str[n];
        str[n]=tmpstr; 
        }

然后它应该可以工作了。

关于c++ - 堆在 C++ 中的算法重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24786818/

相关文章:

algorithm - 计算基本操作

python - 如何使用 itertools 中的组合对象来查找我要输入的字符串的每种排列?

algorithm - 选择对暴力攻击更有弹性的密码

r - 生成 0 和 1 排列的有效方法?

生成 n 个项目的 k 元组的算法,每个项目至少使用一次 (k>n)

c++ - 过去某个时间点无法读取二进制文件

c++ - 无法删除对象数组C++

c++ - wow64!_TEB32 未找到

c++ - 我想知道进程的 BSS 段是否可以在程序执行期间增长

python - 在字符串列表中标记动态子字符串