Python 递归地在两个字符串之间查找公共字符

Python 递归地在两个字符串之间查找公共字符,python,python-3.x,recursion,Python,Python 3.x,Recursion,我正在尝试编写一个递归代码,接收2个字符串,如果它们有一个公共字符,则返回True;如果没有,则返回False。 我首先编写了一个迭代代码,因为我认为它可能会有所帮助。 我的问题是,我不知道如何比较每个字符串中的所有字符。这就是我目前所做的: 迭代代码: def any_char_present_it(s1,s2): if len(s1)==0 or len(s2)==0: return False for i in s2: for m in s1

我正在尝试编写一个递归代码,接收2个字符串,如果它们有一个公共字符,则返回True;如果没有,则返回False。 我首先编写了一个迭代代码,因为我认为它可能会有所帮助。 我的问题是,我不知道如何比较每个字符串中的所有字符。这就是我目前所做的: 迭代代码:

def any_char_present_it(s1,s2):
    if len(s1)==0 or len(s2)==0:
        return False
    for i in s2:
        for m in s1:
            if i==m:
                return True
    return False
递归代码:

def any_char_present(s1,s2):
    if len_rec(s2)==0:
        return False
    if s1[0]==s2[0]:
        return True
    return any_char_present(s1,s2[1:])

您可以使用集合和集合论来检查常见字符,而无需自己遍历所有内容

has_common_chars
将两个字符串转换为集合并找到它们的交集。如果交点的长度大于零,则至少有一个公共字符

s1 = "No one writes to the Colonel"
s2 = "Now is the time or all good men to come to the ade of the lemon."
s3 = "ZZZZ"

def has_common_chars(s1, s2):
    return len(set(s1) & set(s2)) > 0

print has_common_chars(s1, s2)
print has_common_chars(s2, s3)

>>> True
>>> False

编辑s/union/intersection

您可以使用集合和集合论来检查公共字符,而无需自己遍历所有内容

has_common_chars
将两个字符串转换为集合并找到它们的交集。如果交点的长度大于零,则至少有一个公共字符

s1 = "No one writes to the Colonel"
s2 = "Now is the time or all good men to come to the ade of the lemon."
s3 = "ZZZZ"

def has_common_chars(s1, s2):
    return len(set(s1) & set(s2)) > 0

print has_common_chars(s1, s2)
print has_common_chars(s2, s3)

>>> True
>>> False

编辑s/union/intersection

您可以使用集合和集合论来检查公共字符,而无需自己遍历所有内容

has_common_chars
将两个字符串转换为集合并找到它们的交集。如果交点的长度大于零,则至少有一个公共字符

s1 = "No one writes to the Colonel"
s2 = "Now is the time or all good men to come to the ade of the lemon."
s3 = "ZZZZ"

def has_common_chars(s1, s2):
    return len(set(s1) & set(s2)) > 0

print has_common_chars(s1, s2)
print has_common_chars(s2, s3)

>>> True
>>> False

编辑s/union/intersection

您可以使用集合和集合论来检查公共字符,而无需自己遍历所有内容

has_common_chars
将两个字符串转换为集合并找到它们的交集。如果交点的长度大于零,则至少有一个公共字符

s1 = "No one writes to the Colonel"
s2 = "Now is the time or all good men to come to the ade of the lemon."
s3 = "ZZZZ"

def has_common_chars(s1, s2):
    return len(set(s1) & set(s2)) > 0

print has_common_chars(s1, s2)
print has_common_chars(s2, s3)

>>> True
>>> False

编辑s/union/INTERACTION

为了摆脱代码,您必须尝试每种组合。为此,可以在return语句中按如下方式递减每个字符串:

#return check(s1, decremented s2) or check(decremented s1, s2)
return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))
这将用尽所有可能的组合,在两个字符串输入的任意点上找到字符匹配

完整代码:

def any_char_present(s1,s2):
    #update this if statement to check both strings
    #you can check for empty strings this way too
    if not s1 or not s2:
        return False
    if s1[0]==s2[0]:
        return True
    return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))

print(any_char_present("xyz", "aycd"))

为了摆脱你的代码,你必须尝试每一种组合。为此,可以在return语句中按如下方式递减每个字符串:

#return check(s1, decremented s2) or check(decremented s1, s2)
return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))
这将用尽所有可能的组合,在两个字符串输入的任意点上找到字符匹配

完整代码:

def any_char_present(s1,s2):
    #update this if statement to check both strings
    #you can check for empty strings this way too
    if not s1 or not s2:
        return False
    if s1[0]==s2[0]:
        return True
    return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))

print(any_char_present("xyz", "aycd"))

为了摆脱你的代码,你必须尝试每一种组合。为此,可以在return语句中按如下方式递减每个字符串:

#return check(s1, decremented s2) or check(decremented s1, s2)
return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))
这将用尽所有可能的组合,在两个字符串输入的任意点上找到字符匹配

完整代码:

def any_char_present(s1,s2):
    #update this if statement to check both strings
    #you can check for empty strings this way too
    if not s1 or not s2:
        return False
    if s1[0]==s2[0]:
        return True
    return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))

print(any_char_present("xyz", "aycd"))

为了摆脱你的代码,你必须尝试每一种组合。为此,可以在return语句中按如下方式递减每个字符串:

#return check(s1, decremented s2) or check(decremented s1, s2)
return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))
这将用尽所有可能的组合,在两个字符串输入的任意点上找到字符匹配

完整代码:

def any_char_present(s1,s2):
    #update this if statement to check both strings
    #you can check for empty strings this way too
    if not s1 or not s2:
        return False
    if s1[0]==s2[0]:
        return True
    return (any_char_present(s1,s2[1:]) or any_char_present(s1[1:],s2))

print(any_char_present("xyz", "aycd"))


如果这是为了家庭作业,或者是第一次专门学习编程,我不会给出我个人用于解决这个问题的确切代码。不过,我会给你一个提示:你可以使用集合并检查交叉点。编辑:哦,我看到在我写这篇文章的时候,有人已经提供了一个基于集合的答案。哦,好吧。请记住,Python语言在创建递归调用堆栈时有很多开销,因此您会注意到,对于大输入,迭代版本的速度要快得多。如果在递归之前使用集合减少字符串,肯定会更快,特别是如果您将自己限制为ASCII字符集。如果这是为了家庭作业,或者是第一次专门学习编程,我不会给出我个人用于此问题的确切代码。不过,我会给你一个提示:你可以使用集合并检查交叉点。编辑:哦,我看到在我写这篇文章的时候,有人已经提供了一个基于集合的答案。哦,好吧。请记住,Python语言在创建递归调用堆栈时有很多开销,因此您会注意到,对于大输入,迭代版本的速度要快得多。如果在递归之前使用集合减少字符串,肯定会更快,特别是如果您将自己限制为ASCII字符集。如果这是为了家庭作业,或者是第一次专门学习编程,我不会给出我个人用于此问题的确切代码。不过,我会给你一个提示:你可以使用集合并检查交叉点。编辑:哦,我看到在我写这篇文章的时候,有人已经提供了一个基于集合的答案。哦,好吧。请记住,Python语言在创建递归调用堆栈时有很多开销,因此您会注意到,对于大输入,迭代版本的速度要快得多。如果在递归之前使用集合减少字符串,肯定会更快,特别是如果您将自己限制为ASCII字符集。如果这是为了家庭作业,或者是第一次专门学习编程,我不会给出我个人用于此问题的确切代码。不过,我会给你一个提示:你可以使用集合并检查交叉点。编辑:哦,我看到在我写这篇文章的时候,有人已经提供了一个基于集合的答案。哦,好吧。请记住,Python语言在创建递归调用堆栈时有很多开销,因此您会注意到,对于大输入,迭代版本的速度要快得多。如果在递归之前使用集合减少字符串,那么肯定会更快,特别是如果您将自己限制为ASCII字符集。&is Intersection,| is union我应该在提交之前再次阅读这些内容。谢谢。不过这不是递归的。&是交集,|是联合,我真的应该在提交之前再读一遍这些东西。谢谢。不过这不是递归的。&是交集,|是联合,我真的应该在提交之前再读一遍这些东西。谢谢。不过这不是递归的。&是吗