我得到一个排序字符串,我希望计算以下约束条件下可能出现的子串数(不一定是连续的):
例如:
代表“aabbc”, 我们有3个子串“abc”,“abb”,“abbc”符合上述约束。所以,这里3是ans。
我如何寻找一般字符串?
我已经尝试了2-3个小时,但找不到合适的方法。我今天在编程编码中被问到这个问题,我担心明天的采访会提出同样的问题。即使提示或方法也会受到赞赏。
答案 0 :(得分:2)
假设我们有k个元音,并且数组A指定每个非元音的直方图。 (即A[0]
是第一个非元音的编号,A[1]
是第二个非元音的编号。)
然后(忽略长度约束)我们对元音有k个选择,剩余字母有(A[0]+1)*(A[1]+1)*(A[2]+1)*...
个选择(对于每个非元音,我们可以选择0,1,2,...,A[i]
)。
对于双字母案例,这超过k(对于单字母案例)和k * len(A),因此只需从总数中减去这些。
示例Python代码:
from collections import Counter
s='aabbc'
vowels = 'aeiou'
C = Counter(s)
t = 1
vowel_count = 0
cons_count = 0
for letter,count in C.items():
if letter in vowels:
vowel_count += 1
else:
cons_count += 1
t *= count+1
print vowel_count * (t - cons_count - 1)