考虑字符串上的以下函数:
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 吗?