【发布时间】:2015-07-03 14:29:23
【问题描述】:
我知道的算法如下,但我讨厌这种方法的原因是它的时间复杂度是 O((n+1)!) 在大字符串的情况下太糟糕了
首先对字符串进行排序并将其打印为第一个排列。
现在,我们可以找到下一个排列如下:设 i 为满足 input[i]
还有比上述更好的方法吗?(如果通过代码进行解释,请考虑 c 或 c++)...只是我期待一种更好的算法,其时间复杂度低于上述方法
【问题讨论】:
我知道的算法如下,但我讨厌这种方法的原因是它的时间复杂度是 O((n+1)!) 在大字符串的情况下太糟糕了
首先对字符串进行排序并将其打印为第一个排列。
现在,我们可以找到下一个排列如下:设 i 为满足 input[i]
还有比上述更好的方法吗?(如果通过代码进行解释,请考虑 c 或 c++)...只是我期待一种更好的算法,其时间复杂度低于上述方法
【问题讨论】:
长度为n 的字符串有n! 排列。简单地打印它们是O(n * n!),你怎么能指望它会更有效率?
【讨论】:
n!排列。
即使是打印字符串排列的标准 C++ 实现也遵循完全相同的算法(std::next_permutation 和 std::prev_permutation)
std::string s;
std::sort(s.begin(), s.end());
do {
std::cout << s << std::endl;
} while(std::next_permutation(s.begin(), s.end()));
【讨论】:
请记住,在 C++ 中,STL 有 std::next_permutation 可以完成您需要的工作
【讨论】: