String 为多个查询计算字符串中字符的出现次数?
我想为n个查询查找字符串中出现的字符: 例如,字符串是:“我爱数学” 任务是找出以下情况的发生: 范围内的“i”:String 为多个查询计算字符串中字符的出现次数?,string,algorithm,data-structures,range-query,string-algorithm,String,Algorithm,Data Structures,Range Query,String Algorithm,我想为n个查询查找字符串中出现的字符: 例如,字符串是:“我爱数学” 任务是找出以下情况的发生: 范围内的“i”: 1-4(a substring starting from 1st character and ending at 4th) 2-5 3-10 范围内的“\”: 1-10 3-9 产出将是: 1 0 0
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),但在这种情况下,如果我这样做,会导致非常高的复杂性,是否有一种数据结构可以用来解决此问题?我们将保留每个字符在每个位置的出现次数,例如字符串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
现在,如果我们想回答一个问题,我们可以执行以下操作
范围为3-5的字母“a”
我们在位置5减去位置3之前的出现次数,即[5]-a[3-1]=3-1=2字母“a”在3到5之间出现2次,我们将保持每个字符在每个位置的出现次数,例如字符串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
现在,如果我们想回答一个问题,我们可以执行以下操作
范围为3-5的字母“a”
我们在位置5减去位置3之前的出现次数,即[5]-a[3-1]=3-1=2字母“a”在范围3到5中出现了2次,搜索每个查询的范围的时间复杂度为O(n*q) n:字符串的长度 问:查询数目 但是有一个更好的方法 你可以用 树构造的时间复杂度为O(N),每个查询的时间复杂度为O(log(N))
因此,对于q查询,时间复杂度将是O(q*log(n))搜索每个查询的范围的时间复杂度将是O(n*q) n:字符串的长度 问:查询数目 但是有一个更好的方法 你可以用 树构造的时间复杂度为O(N),每个查询的时间复杂度为O(log(N)) 因此,对于q查询,时间复杂度将是O(q*log(n))复杂度将是
O(q*n)
,其中q
是查询的数量,n
是字符串的长度(如果您使用简单的实现)。或者,您可以使用树将复杂度降低到O(qlogn)
,空间复杂度为O(n)
。或者可以使用一个表,将每个字符映射到某个字符所在的索引列表。复杂性将保持不变。复杂性将是O(q*n)
,其中q
是查询的数量,n
是字符串的长度(如果您选择简单的实现)。或者,您可以使用树将复杂度降低到O(qlogn)
,空间复杂度为O(n)
。或者可以使用一个表,将每个字符映射到某个字符所在的索引列表。复杂性将保持不变。