得到答案后编辑
这里有一些很好的答案。我喜欢 Josh 的,因为它非常聪明并且使用 C++。但是,我决定接受 Dave 的回答,因为它简单且具有递归性。我对它们都进行了测试,它们都产生了相同的正确结果(尽管顺序不同)。所以再次感谢大家。
假设我有一个字符串 s 的字符 s[0]:s[N] 并且每个字符 s[i] <= s[i+1] 例如字符串
aaacdddghzz
我想生成子字符串的所有组合,同时保持字符之间的相同关系。
所以例如我会得到
a
aa
aaa
ad
aad
aaad
add
aadd
aaadd
addd
aaddd
aaaddd
d
dd
ddd
.
.
.
ac
aac
.
.
.
acdddghzz
aacdddghzz
aaacdddghzz
但不是
ca
hdz
...etc
现在我知道如何计算出有多少种组合。您创建字符串中字母频率的直方图。所以在上面的例子中,那将是
对于字符串 aaacdddghzz
a=3
d=3
c=1
g=1
h=1
z=2
公式是(a+1)(c+1)(d+1)(g+1)(h+1)(z+1) = 4*4*2*2*2*3 = 384
。有 384 个子字符串保持 s[i] <=s [i+1] 关系。
所以问题是如何递归地生成这 384 个子字符串?实际上,迭代方法同样好,也许更好,因为具有许多唯一字符的大字符串可能会导致堆栈溢出。这听起来像是家庭作业,但事实并非如此。我只是想出这样的算法没用。我使用 C++,但伪代码会很好。