在两个单词之间找到共同字母,找不到代码中的错误
我需要写一段代码,输入两个字符串,如果这两个字符串有共同的字母,就输出True(真),如果没有共同的字母,就输出False(假)。而且我必须用递归的方式来实现这个功能。
运行示例:
any_char_present("adsf","") #returns False
any_char_present("a","sfgserta") #returns true
我的代码在大多数情况下都能给出正确的答案,但在这个情况下却给出了错误的答案:
>>> any_char_present("abcefghijklmno","pqrstuvwxyza")
False
我找不到代码中的错误,这就是我的代码:
def any_char_present(s1,s2):
if not s1 or not s2:
return False
if s1[0]==s2[0]:
return True
elif s1[0]!=s2[0]:
s1=s1[1:]
return any_char_present(s1,s2) or any_char_present(s2,s1)
3 个回答
0
我建议一个更好更有效的解决方案,如下所示:
def any_char_present(s1,s2):
list1 = list(s1)
list2 = list(s2)
return set(list1).intersection(list2)
最后这条语句会返回一个字符列表,这些字符在两个字符串中都是相同的。
2
这是因为在你的代码中,第一次调用结束时,你把 s1
设置成了 'bcefghijklmno'
,所以之后的任何比较都会变得不同,因此结果是 False
。
如果这是一个编程练习,我建议你自己想办法解决,因为这可能正是你做这个练习的原因。
否则,你可以这样做:
def any_char_present(s1, s2):
return len(list(set(s1) & set(s2))) > 0
这样会创建一个包含两个字符串中都有的字母的列表,如果这个列表的长度大于0,就会返回 True
,也就是说至少有一个共同的字母;如果没有共同的字母,就返回 False
。
希望这对你有帮助。
2
我猜你这是在做作业,所以我只给你一些方向上的指导。在此之前,先提个建议:你的代码效率不高,因为你会多次检查相同的“子词”。在第一个if语句之前加一句print s1,s2
,这样可以帮助你更好地理解。
>>> any_char_present("abc","def")
abc def
bc def
c def
def
def
def c
ef c
f c #this
c
c
c f #is here
f
f
c ef
ef
ef
def bc
ef bc
f bc
bc
bc
bc f
c f #is here again
f
f
f c #and here
c
c
bc ef
c ef
ef
ef
ef c
f c #and also there
c
c
c f #or there
f
f
现在,关于你的问题:在第一次循环中,你检查s1[0]
和s2[0]
,如果它们不同,你就尝试用s1
的其余部分去检查s2
。但是你还没有检查s1[0]
和s2
的其余部分。
所以,如果s1
的第一个字母不是s2
的第一个字母,而是s2
的第二个字母,你的代码就会出错。
另外,如果你的作业不是关于递归的,可以看看in
这个操作符:
>>> 'c' in 'abcd'
True