【问题标题】:Round G - Kick Start 2020 Problem Kick_Start Wrong Answer回合 G - Kick Start 2020 问题 Kick_Start 错误答案
【发布时间】:2020-10-18 15:38:30
【问题描述】:

问题:

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' 的索引,并查找每个'KICK' 之后出现的START 的数量。

我得到了错误的答案我不明白我错过了什么边缘情况。

代码如下:

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))

【问题讨论】:

  • 阅读作业必须被视为残忍和不寻常的惩罚。

标签: python python-3.x


【解决方案1】:

终于找到了代码遗漏的案例。

re.finditer() 只能计算 non-overlapping 匹配项,因此像 'KICKICK' 这样的字符串将导致只计算 1 次而不是 2 次 KICK。

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.

【讨论】:

    【解决方案2】:

    这是我的代码:

    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))
    

    你没有考虑所有的可能性。该代码仅显示了 KICK 和 START 发生的次数

    【讨论】:

    • 我想要做的是将所有出现的 KICK 的起始索引存储在列表 temp1 和 START 在 temp2 中,然后从 KICK 获取每个索引并在它之后找到所有出现的 START 并增加计数.您的解决方案是正确的,您能否帮助找出我的方法有什么问题。谢谢
    【解决方案3】:

    我希望这可行。

    T=int(input())
    for x in range(1, T + 1):   
    P=input()
        c=0
        for i in range(0,len(P)-4+1):
            if (P[i:i+4]=="KICK"):
                for j in range(i+4,len(P)-5+1):
                    if (P[j:j+5]=="START"):
                        c=c+1
        print("Case #{}: {}".format(x, c), flush = True)
    

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多