Algorithm 具有至少3个连续相同字符的二进制子字符串数

Algorithm 具有至少3个连续相同字符的二进制子字符串数,algorithm,Algorithm,我正在学习算法,并试图用二进制子串来解决这个问题 我能想到的只有暴力战略。有没有可能用更好的方法来做呢 我将使用示例展示我的方法 考虑以下二进制字符串 010001 答案是6=>(2,4),(1,4),(0,4),(2,5),(1,5),(0,5) 我的做法: 查找至少包含3个相同字符的子字符串 进入左侧和右侧并计算结果 对至少3个相同字符的每个子字符串重复此操作 如何更好地执行此操作?首先,您不能在少于时间的时间内执行此操作O(n),因为您必须扫描字符串才能找到3次相同的运行 但为了让它更有

我正在学习算法,并试图用二进制子串来解决这个问题

我能想到的只有暴力战略。有没有可能用更好的方法来做呢

我将使用示例展示我的方法

考虑以下二进制字符串

010001
答案是6=>(2,4),(1,4),(0,4),(2,5),(1,5),(0,5)

我的做法:

  • 查找至少包含3个相同字符的子字符串
  • 进入左侧和右侧并计算结果
  • 对至少3个相同字符的每个子字符串重复此操作

  • 如何更好地执行此操作?

    首先,您不能在少于时间的时间内执行此操作
    O(n)
    ,因为您必须扫描字符串才能找到3次相同的运行

    但为了让它更有趣,假设我们的字符串是
    0100111000010
    。在一次扫描中,我们可以列出我们结束至少3次运行的所有位置。将字符串的开头计数为
    0
    ,这些位置为
    7、10、11
    ,字符串的长度为13

    我们能从中找到答案吗

    对于从
    0
    7-3=4
    5
    起始位置,以及从
    7
    13
    的所有
    8
    结束位置(请非常小心潜在的围栏柱错误!),我们包括第一次运行的1。所以这里有40个

    对于从
    5
    10-3=7
    3
    起始位置和从
    10
    13
    的所有
    4
    结束位置,我们包括第一个
    000
    ,即
    12
    更多

    对于从
    8
    11-3=8
    1
    起始位置和从
    11
    13
    的所有
    3
    结束位置,我们包括第二个
    000
    ,即
    3
    更多

    因此答案是
    40+12+3=55


    你能概括这一行并编写程序吗?如果是这样,它将在时间
    O(n)
    中执行,这是最好的。

    是的,这是一个组合问题。在你描述的算法中,你一定不要忘记删除重复的子字符串(简单地说你也应该注意重复计数)@WillemVanOnsem是的,但我仍然不知道如何解决它:(