有没有更好的方法来进行字符串排列?

2023-12-12

void permute(string elems, int mid, int end)
{
    static int count;
    if (mid == end) {
        cout << ++count << " : " << elems << endl;
        return ;
    }
    else {
    for (int i = mid; i <= end; i++) {
            swap(elems, mid, i);
            permute(elems, mid + 1, end);
            swap(elems, mid, i);
        }
    }
}

上面的函数显示了排列str(with str[0..mid-1]作为稳定的前缀,并且str[mid..end]作为可替换后缀)。所以我们可以使用permute(str, 0, str.size() - 1)显示一个字符串的所有排列。

但该函数使用了递归算法;也许它的性能可以提高?

有没有更好的方法来排列字符串?


这是来自维基百科条目的 C++ 中的非递归算法排列的无序生成。对于字符串s长度n,对于任何k from 0 to n! - 1包含在内,以下修改s提供唯一的排列(即,不同于为该范围内任何其他 k 值生成的排列)。要生成所有排列,请对所有 n! 运行它。ks 的原始值的值。

#include <algorithm>

void permutation(int k, string &s) 
{
    for(int j = 1; j < s.size(); ++j) 
    {
        std::swap(s[k % (j + 1)], s[j]); 
        k = k / (j + 1);
    }
}

Here swap(s, i, j)交换字符串 s 的位置 i 和 j。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有更好的方法来进行字符串排列? 的相关文章

随机推荐