在两个单词之间找到共同字母,找不到代码中的错误

0 投票
3 回答
763 浏览
提问于 2025-04-18 02:57

我需要写一段代码,输入两个字符串,如果这两个字符串有共同的字母,就输出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

撰写回答