【发布时间】:2010-10-28 03:11:27
【问题描述】:
得到答案后编辑
这里有一些很好的答案。我喜欢 Josh 的,因为它非常聪明并且使用 C++。但是,我决定接受 Dave 的回答,因为它简单且具有递归性。我对它们都进行了测试,它们都产生了相同的正确结果(尽管顺序不同)。再次感谢大家。
假设我有一个字符串 s 字符 s[0]:s[N] 并且每个字符 s[i]
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]
所以问题是如何递归地生成这 384 个子字符串?实际上,迭代方法同样好,也许更好,因为具有许多唯一字符的大字符串可能会导致堆栈溢出。这听起来像是家庭作业,但事实并非如此。我只是想出这样的算法没用。我使用 C++,但伪代码就可以了。
【问题讨论】:
-
澄清一下,您是否认为从不同位置获取的相同字母序列是相同的子字符串?即 [0..1] == "aa" 与 [1..2] == "aa" 相同吗?
-
此外,我注意到您的结果中有“ac”,但原始字符串中没有出现“ac”序列。所以从技术上讲,它不是原始字符串的“子字符串”,尽管它是从原始字母序列派生的排列。
-
c
-
@Curt - 是的,在这种情况下,“aa”将是相同的子字符串
-
@Curt 再次 - 是的,对不起,“所有子字符串”我的意思是保持原始顺序(即按字母顺序)的“所有排列”
标签: c++ algorithm recursion substring sequences