0

所以这是我的代码

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'))

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

4

3 回答 3

0

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

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”,所以下一次迭代不会在与以前相同的地方找到“生病”,这会导致两次计算相同的出现。

于 2021-10-24T03:32:34.320 回答
0

你的条件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' 在 'banana' 中计为 2。

于 2021-10-24T03:34:10.397 回答
0

您可以使用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
于 2021-10-24T04:18:11.973 回答