【问题标题】:Checking Kangaroo word in python在python中检查袋鼠字
【发布时间】:2016-10-26 17:52:30
【问题描述】:

Kangaroo 词是指包含另一个词但没有转置任何字母的词。例如,勇气包含 cog、cur、core 等但不包含 run、gen、gone。给定 2 个字符串我试图检查第一个字符串是袋鼠二字。

这是我的代码

import sys
s1=input().rstrip()
s1l=[]
for i in s1:
    s1l.append(i)
s2=input().rstrip()
s2l=[];sol=[]
for i in s2:
    s2l.append(i)
ls=len(s1l)
for i in range(ls):
    for j in range(ls):
        for k in range(ls):
            sol.append((s1[i]+s1[j]+s1[k]))
for i in sol: 
    if i==s2:
        print('s1 is a kangaroo word of s2')
        sys.exit()
print('s1 is Not a kangaroo word of s2')     

但我无法获得所需的输出。例如,对于 s1=chariot 和 s2=rat,我的代码显示为真,而答案为假。有人可以解释一下我犯了什么错误吗?

【问题讨论】:

    标签: string python-3.x loops combinatorics


    【解决方案1】:

    除了您的问题之外,您还可以做很多不同的事情,所以我将对其中的一些进行评论。

    但是,您的主要问题是您在所有字符上循环 ijk,而不是限制 i < j < k 始终为真。

    import sys
    s1=input().rstrip()
    s1l=[]
    for i in s1:
        s1l.append(i)
    s2=input().rstrip()
    s2l=[];sol=[]
    for i in s2:
        s2l.append(i)
    

    这段代码可以写得更简洁:

    import sys
    s1=input().rstrip()
    s2=input().rstrip()
    
    s1l=[c for c in s1]
    s2l=[c for c in s2]
    
    sol=[]
    

    这更加 Pythonic 和干净。但是,您从不使用s2l,那为什么要这样做呢?

    import sys
    s1=input().rstrip()
    s2=input().rstrip()
    
    s1l=[c for c in s1]
    sol=[]
    

    更好。但是您实际上可以在不将其放入列表的情况下对字符串进行索引。无论如何,您从未使用过s1l,除了长度,您可以使用s1

    import sys
    s1=input().rstrip()
    s2=input().rstrip()
    sol=[]
    
    ls=len(s1)
    for i in range(ls):
        for j in range(ls):
            for k in range(ls):
                sol.append((s1[i]+s1[j]+s1[k]))
    

    这是您的主要问题所在。我会先按照你的方式修复它:

    ls=len(s1)
    for i in range(ls-2):
        for j in range(i+1, ls-1):
            for k in range(j+1, ls):
                sol.append((s1[i]+s1[j]+s1[k]))
    

    但是,如果您已经知道它有一个袋鼠词,为什么还要继续构建可能的解决方案列表(sol)?这是一个更好的解决方案。而不是这个:

    ls=len(s1)
    for i in range(ls-2):
        for j in range(i+1, ls-1):
            for k in range(j+1, ls):
                sol.append((s1[i]+s1[j]+s1[k]))
    for i in sol: 
        if i==s2:
            print('s1 is a kangaroo word of s2')
            sys.exit()
    print('s1 is Not a kangaroo word of s2')   
    

    这样做:

    ls=len(s1)
    for i in range(ls-2):
        for j in range(i+1, ls-1):
            for k in range(j+1, ls):
                word = s1[i]+s1[j]+s1[k]
                if word == s2:
                    print('s1 is a kangaroo word of s2')
                    sys.exit()
    print('s1 is Not a kangaroo word of s2')
    

    但是……这个方案只能找到长度为3的子词,还是比较麻烦的。要让它找到所有长度的子词,您必须更加小心...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2013-10-20
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多