G轮-踢2020问题Kick_Start错误答案

时间:2020-10-18 15:38:30

标签: python python-3.x

问题:

Ksenia非常喜欢阅读,因此她每天都会通过阅读 从她最喜欢的书的片段开始,然后再开始与她的其余部分 早上例行。片段只是文本的子字符串。克塞尼亚 有点迷信,她相信如果 她读取的片段以字符串KICK开头,然后继续 0个或更多字符,并最终以字符串START结束,即使 如果整个片段没有意义。

给出书中的文字,算出不同的幸运数 Ksenia在书变老之前需要阅读的片段 买另一个。如果两个片段被认为是不同的 它们开始或结束于文本中的不同位置,即使 片段读取相同。另请注意,不同的幸运片段可能 重叠。

输入:

输入的第一行给出测试用例的数量T。T行 跟进,每个包含由大写字母组成的单个字符串S 仅英文字母。

输出:

对于每个测试用例,输出包含Case #x的一行:y,其中x为 测试用例编号(从1开始),y是 该测试用例的文本中有不同的幸运片段。

限制:

内存限制:1 GB。 1≤T≤100。S包含大写英文 仅字母。

测试集1:

时间限制:20秒。 1≤| S | ≤1000。

测试集2:

时间限制:40秒。 1≤| S | ≤105。

示例:

Input
3
AKICKSTARTPROBLEMNAMEDKICKSTART
STARTUNLUCKYKICK
KICKXKICKXSTARTXKICKXSTART

Output
Case #1: 3
Case #2: 0
Case #3: 5

我尝试使用Python解决它。我尝试使用的逻辑是查找子字符串'KICK'和子字符串'START'的索引,并找到在每个START之后出现的'KICK'的数量。

我得到的答案是错误的,我不知道我缺少哪些边缘情况。

代码如下:

import re

t = int(input())

for i in range(t):
    text = input()
    matches = 0
    temp1 = [m.start() for m in re.finditer('KICK',text)]
    temp2 = [m.start() for m in re.finditer('START',text)]
    if len(temp1) == 0 or len(temp2) == 0:
        matches = 0
    else:
        for ele in temp1:
            for x in temp2:
                if(x > ele):
                    matches = matches + 1
    print("Case "+"#"+str(i+1)+": "+str(matches))

2 个答案:

答案 0 :(得分:0)

这是我的代码:

t = int(input())
for x in range(t):
    s = input()
    ans = 0
    k = 0
    for i in range(len(s)-4):
        if s[i:i+4] == "KICK":
            k += 1
            
        if s[i:i+5] == "START" and k != 0:
            ans += k
    print("Case #{}: {}".format(x+1, ans))

您并未考虑所有可能性。该代码仅显示了踢和启动发生了多少时间

答案 1 :(得分:0)

最后,我找到了代码遗漏的情况。

re.finditer()只能计数不重叠个匹配项,因此,像'KICKICK'这样的字符串将仅对KICK计数1次而不是2次。

re.finditer(pattern, string, flags=0)
Return an iterator yielding MatchObject instances over all non-overlapping matches for the RE pattern in string.The string is scanned left-to-right, and matches are returned in the order found. Empty matches are included in the result.