【问题标题】:Find a string in a string - Python在字符串中查找字符串 - Python
【发布时间】:2026-02-21 00:25:02
【问题描述】:

我正在尝试实现一个在字符串中递归查找文本的函数。

我试过这个,但我不知道为什么它不起作用。请注意,我是编码新手。

def find(text, substring):
  if len(text) == 0:
     return 0
  while substring[0] in text:
     return find(text, substring[1:])

谢谢! :)

示例

find("mississippi", "sip")
True
find("to be or not to be", "be")
True
find("mississippi", "sup")
False

【问题讨论】:

  • 预期的结果是什么,你得到的结果是什么?
  • 当到达字符串末尾时,您有一个基本情况,但当找到匹配项时,您还需要一个基本情况。
  • @GregPrisament 你的意思是“当没有找到匹配的时候”?
  • 快速找到一个子串并不是一件容易的事,递归算法会导致 O(n^2) 算法。使用 Knuth-Patterson 算法,可以实现 O(n) 线性时间。

标签: python string


【解决方案1】:

您需要一个递归函数的基本案例,该函数最终将在不递归的情况下返回。除非第一次执行 text=='',否则您的基本案例 len(text)==0 永远不会执行。

【讨论】:

  • 有一个基本情况。如果函数没有运行return 语句,那么它将返回None
  • @KSFT,是的。 OP需要澄清期望的结果是什么;这个函数永远不会返回 True。
【解决方案2】:

有很多更简单的方法可以做到这一点。例如,您可以遍历字符串的索引并检查子字符串是否在该位置,如 here 所述:

[i for i in range(len(string)) if s.startswith(substr,i)]

这将评估为在string 中出现的所有substr 的索引列表。

【讨论】:

    【解决方案3】:

    如果我正确理解您的问题,您希望实现一个递归函数,其中find(text, substring) 给定两个字符串,返回与简单 Python 表达式 substring in text 相同的结果。这个问题的递归分解是:

    • text 是否以substring 开头?如果是,请返回True。 (基本情况 1)
    • text 是空的吗?如果是,请返回False。 (基本情况 2)。
    • 否则,返回 find(text[1:], substring) 的结果 - 我们在较小的问题上调用相同函数的递归情况。

    看看你能不能实现它!对于基本情况一,您将很好地使用 Python 的 String 方法 startswith(google it!)。

    【讨论】: