【发布时间】:2012-06-12 08:57:32
【问题描述】:
考虑以下对字符串的函数:
int F(string S)
{
int N = S.size();
int T = 0;
for (int i = 0; i < N; i++)
for (int j = i + 1; j < N; j++)
if (S[i] > S[j])
T++;
return T;
}
长度为 N 且所有成对不同字符的字符串 S0 总共有 N!独特的排列。
例如“bac”有以下6种排列:
bac
abc
cba
bca
acb
cab
考虑这些 N!按字典顺序排列的字符串:
abc
acb
bac
bca
cab
cba
现在考虑将 F 应用于每个字符串:
F("abc") = 0
F("acb") = 1
F("bac") = 1
F("bca") = 2
F("cab") = 2
F("cba") = 3
给定这组排列中的某个字符串 S1,我们想要找到该集合中的下一个字符串 S2,它与 S1 具有以下关系:
F(S2) == F(S1) + 1
例如,如果 S1 == "acb" (F = 1) 而不是 S2 == "bca" (F = 1 + 1 = 2)
执行此操作的一种方法是从 S1 过去的一个开始并遍历排列列表以寻找 F(S) = F(S1)+1。不幸的是,这是 O(N!)。
S1上的什么O(N)函数可以直接计算S2?
【问题讨论】:
-
当您的输入字符串是最后一个排列时,您期望得到什么答案? IE。如果在您的示例中 S1 = "cba",那么 S2 应该是什么?
-
你可以假设 S1 永远不会是最后一个元素
标签: string algorithm permutation