使用特定属性查找Number的子字符串

时间:2014-06-06 16:49:13

标签: string algorithm dynamic-programming

我得到的字符串只包含0到9之间的数字。我想计算它们中有多少个子字符串是2的幂。

例如,对于子串2560616,子串256和16是2的幂。我需要计算任何给定子串中有多少这样的子串。

请注意,子字符串非常大,因此强力无法使用。所以我主要想解决2个问题

  1. 如何有效地计算2的幂
  2. 的所有子串
  3. 如何有效地计算子字符串是否为2的幂
  4. 我认为可能有DP方法,但我不确定。

1 个答案:

答案 0 :(得分:0)

使用以下算法从2的幂数字创建树:

  1. 从表示空字符的根开始。
  2. 获得2的下一个幂,以相反的顺序得到它的数字。
    1. 选择根目录。选择当前号码的最后一位数。
    2. 转到与所选数字对应的所选节点的子节点。如果它还不存在,请创建它。
    3. 选择当前号码的前一个数字。从(2.)重复,直到没有更多数字。
    4. 将当前节点标记为有效端点。
  3. 从(2.)重复到数字位数> 10 ^ 5
  4. 这棵树在内存中可能需要几个GB。

    现在你有了你的树。要计算2的幂的子串数,请执行以下操作:

    1. 从字符串的结尾开始。
    2. 获取上一个角色。
      1. 选择树的根。
      2. 选择前一个字符(从外部(2。)中选择的字符开始)。
      3. 选择与所选数字对应的所选节点的子节点。
      4. 如果选定的子节点被标记为有效端点,则将计数增加1。
      5. 从(2.)开始重复,直到所选节点为空或到达字符串的第一个字符。
      6. 返回外部(2。)
      7. 中选择的字符
    3. 选择上一个字符。从(2.)开始重复,直到到达字符串的开头。
    4. 算法的描述不是"考试准备",但我希望它足够可理解。