首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找到长度K的好子串,使它的重要性最小。

找到长度K的好子串,使它的重要性最小。
EN

Stack Overflow用户
提问于 2018-12-13 07:44:26
回答 1查看 84关注 0票数 0

将一个好子字符串定义为以'x‘开头,以'z’结尾,长度可被3整除的子字符串。定义字符串的重要性是它与之相交的好子字符串的数量(如果它本身是好的,则不包括它自己)。考虑一个长度为N (1≤N≤10^5)的字符串,它由x,y,z组成,给定一个整数K(1≤K≤10^5),找到具有最小重要性且长度K的好子串,需要打印最小重要性。

我有一个解决这个问题的主意,但我真的不能把它编码出来。首先,它必须在线性/线性时间内完成。

我想的是,把源自我的好的子串的数量存储在贝基,如果我们从右边使用一个计数器,然后按照“z”的模3位置往右加,就可以做到这一点。如果i%3==j,则begi=number of 'z‘在位置j+2 mod 3的右边。类似地,我们可以创建endi,以得到以i结尾的好子字符串的数量。如果我的位置包含'y’,或者如果它没有形成一个好的子字符串,那么我们将编写等于0的begi或endi。

现在,对于下一部分(找到交叉口),我不知道如何得到线性/线性的解。对于特定的间隔[arri,arri+K-1],交叉口的数目为

=在ai之前开始的子串,在ai+K-1之前结束,在ai之后结束,在ai +K-1之后结束。

这就是我的想法。我确信有一些方法可以进行预计算,也许可以修改我所写的方程式,从而得出答案。

EN

回答 1

Stack Overflow用户

发布于 2018-12-13 13:38:26

请注意,累加i=索引i或更大值上开始的好字符串数。答案公式可能有错误,但这个想法应该是正确的。

代码语言:javascript
复制
for i = 0 to N
    beg[i] = end[i] = 0

for i = 0 to 3
    z[i] = 0
    x[i] = 0

for i = 0 to N
    if str[i] == 'z'
        z[i % 3]++

for i = 0 to N
   if str[i] == 'z'
       z[i % 3]--
       end[i] = x[i % 3]
   if str[i] == 'x'
       beg[i] = z[i % 3]
       x[i % 3]++
       total += beg[i]

for i = 0 to N
    accumulated[i] = total
    total -= beg[i]

answer = N + 1

beforeStart = beforeEnd = 0
for i = 0 to N - k
    if str[i] == 'x' and str[i + k] == 'z'
        answer = min(answer, beforeStart - beforeEnd + (accumulated[i + k] - accumulated[i]) + beg[i] - 1)

    beforeStart += beg[i]
    beforeEnd += end[i]

print(answer)      
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53757142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档