繁体   English   中英

如何使用 python 中的递归检查一个字符串是否是另一个字符串的后续?

[英]How to check whether a string is subsequent of another string using recursion in python?

目标:所以我的目标是编写一个递归 function is_subsequent,给定两个字符串,返回第一个字符串是否是第二个字符串的子序列。 例如,给定 hac 和 cathartic,你应该返回 true,但给定 bat 和 table,你应该返回 false。

我试图编写一个代码来检查一个字符串是否是另一个字符串的 substring。 这是我的代码:

def is_subsequent(str1, str2):
    x = 0
    if (all(i in str2 for i in str1)):
        x = 1
    if (x):
        return True
    else:
        return False

但它不关心字符串的顺序。 我想编写一个考虑到目标中提到的顺序的代码。 并使用递归解决它。

递归背后的基本思想是您的 function 做了两个不同的事情:

  1. 如果答案真的很简单,它会返回答案。 (这是一个“基本情况”。)
  2. 否则,它会想办法让问题变得更简单,并调用自己来解决问题的更简单版本。 (调用自身的 function 是“递归”的意思。)

在这个问题的情况下,您有两个基本情况:

  1. 如果第一个字符串为空,则它是 any 的子序列,因此为True
  2. 如果第二个字符串为空(而第一个字符串不是),则没有任何内容可以是它的子序列,因此为False

然后你有两种方法可以使问题变得更容易(即通过使一个或两个字符串更小):

  1. 如果第一个字符匹配,则答案与您在减去第一个字母的两个字符串上调用 function 相同。 (也就是说, acartic IFF c的子序列rtic的子序列。)
  2. 如果不是,那么答案与您使用相同的第一个字符串但减去第二个字符串的第一个字母相同(也就是说, haccathartic的子序列 IFF hacathartic的子序列。)
>>> def is_subsequence(needle: str, haystack: str) -> bool:
...     if not needle:
...         return True
...     if not haystack:
...         return False
...     if needle[0] == haystack[0]:
...         return is_subsequence(needle[1:], haystack[1:])
...     return is_subsequence(needle, haystack[1:])
...
>>> is_subsequence("hac", "cathartic")
True
>>> is_subsequence("bat", "table")
False

就您发布的代码中的逻辑而言,您提出问题的方式似乎存在脱节......

您已经明确表示,将其设为递归 function 是一项要求,但让您的 function 使用关键字all并且仅检查str1中的所有字符str2将完全破坏创建递归 ZA3854F1AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZA3851AB4ZZA3851AB4ZZA3841AB4ZA384F1AB4ZA384F1AB5074C17A94F14Z 使用关键字 all 关键字 all 并仅检查 str1 中所有字符的逻辑。

您可以在每个后续递归调用中传递一个额外的变量并删除字符,并在每次传递时使用一个终止语句,这将为您提供正确的 output。

def is_subsequent(search, text):
    if len(text) < len(search):
        return False
    for i, c in enumerate(search):
        if c != text[i]:
            return is_subsequent(search, text[1:])
    return True

此 function 检查搜索字符串是否至少与文本字符串一样长。
如果是,则依次检查搜索字符串的每个字符,看它是否与文本字符串匹配。
如果字符不匹配,请再次尝试 function,但从文本中的 1 个位置开始。

这里是一个辅助函数,用于处理琐碎的情况,例如子序列为空,它将始终返回 true,或者子序列大于另一个字符串,或者另一个字符串为空,而子序列不是,它将始终返回 false。

def is_subsequent(str1, str2):
    if str1 == "":
        return True
    elif str2 == "" or len(str1) > len(str2):
        return False
    else:
        return _is_subsequent(str1, str2, 0, 0)

这里的 function 采用两个字符串和两个指针,它们始终指示您当前在两个字符串中比较的位置的 position,或者您可以使用两个子字符串并始终比较它们的第一个字符。

如果任何一个指针到达不再在字符串范围内的索引,则该进行评估了。 如果 i-pointer 已到达末尾,则返回 true,否则返回 false。

def _is_subsequent(str1, str2, i, j):
    if i >= len(str1) or j >= len(str2):
        return i >= len(str1)
    if str1[i] == str2[j]:
        return _is_subsequent(str1, str2, i + 1, j + 1)
    else:
        return _is_subsequent(str1, str2, i, j + 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM