[英]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 做了两个不同的事情:
在这个问题的情况下,您有两个基本情况:
True
。False
。然后你有两种方法可以使问题变得更容易(即通过使一个或两个字符串更小):
ac
是artic
IFF c
的子序列rtic
的子序列。)hac
是cathartic
的子序列 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
就您发布的代码中的逻辑而言,您提出问题的方式似乎存在脱节......
您已经明确表示,将其设为递归 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.