字符串预处理步骤,在O(1)时间内回答进一步的查询

时间:2015-02-12 17:35:34

标签: string algorithm

为您提供一个字符串,它包含仅包含3个字符的字符。说,x y z。 将有百万条查询给你。 查询格式:x z i j

现在我们需要找到所有可能的不同子串,这些子串以x开头并以z结尾。 i和j表示子串必须位于的范围的下限和上限。它不应该跨越这一点。

我的逻辑: -

  1. 阅读字符串。有3个数组,分别存储x y z的计数,i = 0直到strlen
  2. 将每个字符的索引分别存储在另外3个数组中。 xlocation [],ylocation [],zlocation []
  3. 现在,根据查询,(a b i j)找到范围i和j内的b的所有索引。
  4. 计算每个b的索引的答案,并将其求和以得到结果。
  5. 是否可以在查询之前预处理此字符串?所以,像这样需要O(1)时间来回答查询。

1 个答案:

答案 0 :(得分:1)

正如其他人所说,你可以用分而治之的算法来做到这一点。

最佳子结构: 如果我们得到一个字符串的左半部分和一个右半部分,我们知道左半部分有多少个子字符串,右半部分有多少个字符串,那么我们可以将这两个数字加在一起。我们将对从左边开始到右边结束的所有字符串进行计数。这只是左子字符串中x的数量乘以右子字符串中的z的数量。

因此我们可以使用递归算法。

如果我们尝试解决单个i和j组合的所有问题,这将是一个问题,因为底层子问题将被解决很多次。

您应该考虑使用动态编程算法来实现这一点,以跟踪范围i,j和范围i,j和范围i,j中的范围i,j,x的子串。