除了您的问题之外,您还可以做很多不同的事情,所以我将对其中的一些进行评论。
但是,您的主要问题是您在所有字符上循环 i、j 和 k,而不是限制 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的子词,还是比较麻烦的。要让它找到所有长度的子词,您必须更加小心...