【问题标题】:How to check whether a string is subsequent of another string using recursion in python?如何在python中使用递归检查一个字符串是否是另一个字符串的子序列?
【发布时间】:2021-02-15 09:36:48
【问题描述】:

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

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

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

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

【问题讨论】:

标签: python string recursion


【解决方案1】:

递归背后的基本思想是你的函数做了两个不同的事情:

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

对于这个问题,你有两种基本情况:

  1. 如果第一个字符串为空,则它是 anything 的子序列,即True
  2. 如果第二个字符串为空(而第一个字符串不是),则 nothing 可以是它的子序列,即False

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

  1. 如果第一个字符匹配,则答案与您在减去第一个字母的两个字符串上调用该函数相同。 (也就是说,acartic 的子序列 IFF crtic 的子序列。)
  2. 如果不是,那么答案与使用相同的第一个字符串但减去第二个字符串的第一个字母相同(即,haccathartic 的子序列 IFF hac 是子序列athartic.)
>>> 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

【讨论】:

    【解决方案2】:
    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
    

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

    【讨论】:

      【解决方案3】:

      这里是一个辅助函数,用于处理琐碎的情况,例如子序列为空,它将始终返回 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)
      

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

      如果任何一个指针到达的索引不再在字符串的范围内,就该进行评估了。如果 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)
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2022-07-01
          • 2013-05-12
          • 2019-05-11
          • 1970-01-01
          • 1970-01-01
          • 2019-03-23
          • 1970-01-01
          • 2023-03-31
          相关资源
          最近更新 更多