【问题标题】:Count the number of occurrences of a character in a string for a number of queries?计算多个查询的字符串中某个字符的出现次数?
【发布时间】:2017-03-04 00:23:48
【问题描述】:

我想为 n 个查询查找字符串中某个字符的出现次数: 例如字符串是:“i_love_mathematics” 任务是找出发生的:

'i' 在范围内:

          1-4(a substring starting from 1st character and ending at 4th)
          2-5
          3-10

'_'在范围内:

           1-10
           3-9

输出将是:

           1
           0
           0
           2
           1

类似的问题是查找字符串中字符的出现次数,但复杂度为 O(N),但在这种情况下,如果我这样做会导致非常高的复杂度,是否有数据可以用来解决这个问题的结构吗?

【问题讨论】:

  • 复杂度为O(q * n),其中q 是查询的数量,n 是字符串的长度(如果您进行简单的实现)。或者,您可以使用树将复杂度降低到O(q log n),空间复杂度为O(n)。或者,您可以使用将每个字符映射到某个字符出现的索引列表的表。复杂性将保持不变。

标签: string algorithm data-structures range-query string-algorithm


【解决方案1】:

我们会保持每个字符在每个位置出现的次数,例如字符串abacaba

    a b a c a b a
|  |1|2|3|4|5|6|7
a | 1 1 2 2 3 3 4
b | 0 1 1 1 1 2 2
c | 0 0 0 1 1 1 1

现在,如果我们想回答一个查询,我们执行以下操作

字母 'a' 在 3-5 范围内

我们在位置 5 处减去位置 3 之前出现的次数,即 a[5]-a[3-1]=3-1=2 在 3 到 3 到5

【讨论】:

    【解决方案2】:

    搜索每个查询的范围的时间复杂度是 O(n*q)

    n: 字符串长度

    q:查询次数

    但是有更好的方法来做到这一点 您可以使用segment trees。

    构建树的时间复杂度为 O(N),每个查询的时间复杂度为 O(log(n))

    因此,对于 q 个查询,时间复​​杂度为 O(q*log(n))

    【讨论】:

      猜你喜欢
      • 2017-10-09
      • 2010-11-12
      • 2013-12-25
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2019-06-03
      相关资源
      最近更新 更多