【问题标题】:How do I find a substring in a string using recursion only?如何仅使用递归在字符串中查找子字符串?
【发布时间】:2021-12-10 02:03:08
【问题描述】:

这是我的代码

def count_occurrences(sub, s):

    if len(s) == 0:
        return 0
    
    else:
        if str(sub) in str(s) and str(sub) == str(s):
            return 1+count_occurrences(sub, s[1:])     
        else:
            return count_occurrences(sub, s[1:])
        
print(count_occurrences('ill', 'Bill will still get ill'))

我相信,当我运行调试器 UI 时,这条 if str(sub) in str(s) and str(sub) == str(s): 语句让我大吃一惊。如果我只是输入if str(sub) in str(s),它会给我一个数字,但它不是我想要的数字,它是 4。

【问题讨论】:

  • 一个例子和你的输出将有助于更好地理解问题
  • 你已经决定 s[1:] 是你应该传递给递归的值,那里的预期逻辑是什么?尝试用简单的英语单词解释您希望代码使用的算法,并解释为什么该算法应该给您正确的答案。然后将其与代码进行比较。
  • "它给了我一个数字,但它不是我想要的数字,它是 4。"那么,它给你的是多少?你能想出一个为什么它给你这个确切数字而不是其他任何东西的原因吗?如果不是,则更详细地跟踪逻辑。尝试在执行的不同点检查更多变量的值。见ericlippert.com/2014/03/05/how-to-debug-small-programs
  • input = count_occurrences('ill', 'Bill 还是会生病') output = 21

标签: python string recursion substring thonny


【解决方案1】:

您的代码不能正常工作,因为您只有在找到将导致程序在同一位置找到子字符串的子字符串时才跳过一个字符,而是在第一次出现后跳到索引子串。此代码将起作用

def count_occurences(s, sub):
    if len(s) == 0:
        return 0
    else:
        ind = s.find(sub)

        if ind>=0:
            return 1+count_occurences(s[ind+1:], sub)
        else:
            return 0

我将 1 添加到索引中,因为在“生病”的情况下,find() 会给我字母“i”的索引,所以如果我给s[ind+1:],它将删除第一个之前的所有字符'l' 即包括 'i',因此下一次迭代不会在与之前相同的位置找到“病”,这会导致两次计算相同的出现次数。

【讨论】:

    【解决方案2】:

    您的条件str(sub) == str(s) 永远不会为真,除非子字符串位于最后。您必须比较字符串的开头(与子字符串的长度相同),而不是在任何位置搜索它,否则您将多次计算相同的匹配。此外,如果您已经在处理字符串,则不需要使用 str()。

    def count_occurrences(sub, s):
        if len(sub)>len(s): return 0
        return s.startswith(sub) + count_occurrences(sub,s[1:]) # True is 1
    

    输出:

    print(count_occurrences('ill', 'Bill will still get ill'))
    
    4
    

    请注意,我假设您要计算重叠的子字符串。例如:“香蕉”中的“ana”计为 2。

    【讨论】:

      【解决方案3】:

      您可以使用str.split().count() 进行如下计数:

      def count_occurrences(sub, s):
          if not(len(s.strip())):
              return 0
          splt_s = s.split()
          return (splt_s[0].count(sub)) + count_occurrences(sub, ' '.join(splt_s[1:]))
      

      输出:

      >>> count_occurrences('ill', 'Bill will still get ill')
      4
      
      >>> count_occurrences('ill', 'Billwillstillgetill   Billwillstillgetill    ')
      8
      

      【讨论】:

        猜你喜欢
        • 2014-02-19
        • 2019-10-01
        • 2014-05-16
        • 2016-10-02
        • 2015-05-13
        • 2019-03-29
        • 1970-01-01
        • 2016-01-27
        • 1970-01-01
        相关资源
        最近更新 更多