具有给定约束的子串数

时间:2016-08-06 20:50:59

标签: string algorithm

我得到一个排序字符串,我希望计算以下约束条件下可能出现的子串数(不一定是连续的):

  1. 子字符串中的所有字母都应按排序顺序排列。
  2. 子字符串必须只包含1个元音。
  3. 子字符串的长度应大于或等于3.
  4. 例如:

    代表“aabbc”, 我们有3个子串“abc”,“abb”,“abbc”符合上述约束。所以,这里3是ans。

    我如何寻找一般字符串?

    我已经尝试了2-3个小时,但找不到合适的方法。我今天在编程编码中被问到这个问题,我担心明天的采访会提出同样的问题。即使提示或方法也会受到赞赏。

1 个答案:

答案 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)