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

String 字符串预处理步骤,在O(1)时间内回答进一步的查询,string,algorithm,String,Algorithm,将为您提供一个字符串,其中包含仅由3个字符组成的字符。喂,xyz。 将有一百万个查询给你。 查询格式:xzij 在这里,我们需要找到所有可能的不同子串,从x开始,到z结束。i和j表示子串必须位于的范围的上界和下界。它不应该越过这个 我的逻辑是:- 读字符串。有3个数组,分别存储x y z的计数,i=0直到strlen 将每个字符的索引分别存储在另外3个数组中。X位置[],Y位置[],Z位置[] 现在,根据查询,(a b i j)找到范围i和j内b的所有索引 计算b的每个指数的答案,并求和得到结果

将为您提供一个字符串,其中包含仅由3个字符组成的字符。喂,xyz。 将有一百万个查询给你。 查询格式:xzij

在这里,我们需要找到所有可能的不同子串,从x开始,到z结束。i和j表示子串必须位于的范围的上界和下界。它不应该越过这个

我的逻辑是:-

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

    正如其他人所建议的,您可以使用分治算法来实现这一点

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

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

    然而,如果我们试图解决所有问题,即单个i和j组合,这将是一个问题,因为底层子问题将被多次解决


    您应该使用动态规划算法来实现这一点,该算法跟踪范围i、j、x中的子字符串,以及范围i、j和z中的子字符串。

    您需要打印子字符串,还是只对它们进行计数?如何花费O(1)时间来提供潜在的O(n^2)值?@IVlad:数一数。我想到了一个解决方案,它涉及线性时间预处理和线性空间使用,支持固定时间查询,但在我描述它之前,我想看看一些证据,证明这不仅仅是一个家庭作业或竞赛问题。给@IVlad的提示:你(现在已删除)的解决方案非常接近!想想如何计算克拉斯科维奇指出的字符串…;-)多么优雅的解释,王力士爵士:这可能是因为该算法的时间复杂度为T(n)=2*T(n)+c,即O(n),n可以是百万,查询也可以是百万。只有当我们可以将其保存为此dp所需的2D数组时,才能避免此问题,但由于内存使用率较高,因此会出现错误。我认为@IVLAd解决方案符合约束条件。