计算子字符串:在给定的文本中,查找以A开头并以B结尾的子字符串数

时间:2018-02-10 22:06:33

标签: algorithm

例如,CABAAXBYA中有四个这样的子串。

我使用的原始强力算法是,使用外部for循环,每当遇到A时,我进入另一个for循环以检查是否存在B。如果找到B,我会增加计数。最后,存储在count变量中的值会产生所需的结果。

我在阅读有关字符串匹配算法的过程中遇到了一个问题,当你从右到左而不是从左到右遍历时,你的算法效率更高但是这里子字符串不是作为函数的参数给出的。用来计算所需的值。

我的问题是,如果我从右到左而不是从左到右遍历字符串,它会使我的算法在任何情况下都更有效吗?

1 个答案:

答案 0 :(得分:8)

这是一种向后遍历字符串的方法可能导致O(n)计算而不是原始的O(n ^ 2)工作:

A = "CABAAXBYA"

count = 0 # Number of B's seen
total = 0
for a in reversed(A):
    if a=='B':
        count += 1
    elif a=='A':
        total += count

print total

这可以通过跟踪当前点右边B的数量来计算。

(当然,你也可以通过计算左边A的数量来获得与前向迭代相同的结果:

count = 0 # Number of A's seen
total = 0
for a in A:
    if a=='A':
        count += 1
    elif a=='B':
        total += count
print total