Vedant Ganjoo
Vedant Ganjoo

Reputation: 33

Finding the number of occurences of a sub-string in a string without using library functions

I have to do this exercise without using library function. So far I have reached here:-

string = input("Enther The String :")
substring = input("Enter the substring :") 
count = 0
for i in range(len(string)):
    if string[i:i+len(substring)] == substring:
        if string[i+len(substring)] == ' ':
            count += 1
        else:
            count = 0
print(count)

But, let us say if the sub-string is 'bob' and the string is 'bob cat bob cat bobs cat', the program still counts 'bob' in 'bobs' and I don't want that. Also this code always returns 0. Please help! Thanks!

Upvotes: 1

Views: 156

Answers (2)

Ashwini Chaudhary
Ashwini Chaudhary

Reputation: 251166

As you're allowed to use slicing, so you can use that to check whether the character before/after the substring is a space or empty string, if it is then increment count by 1. Note that slices never raise exception, even for out of range indices.

def sub_str_count(s, sub_str):
    le = len(sub_str)
    count = 0
    for i in range(len(s)):
        if s[i:i+le] == sub_str and s[i-1:i] in ('', ' ') and \
                                                       s[i+le:i+le+1] in ('', ' '):
            count += 1
    return count

Exception handling based version of the above code:

def check(s, ind):
    """
    Check whether the item present at this index is a space or not.
    For out of bound indices return True.
    For negative indices return True.
    """

    if ind < 0:
        return True
    try:
        return s[ind] == ' '
    except IndexError:
        return True

def sub_str_count(s, sub_str):
    le = len(sub_str)
    count = 0
    for i in range(len(s)):
        if s[i:i+le] == sub_str and check(s, i-1) and check(s, i+le):
            count += 1
    return count

Upvotes: 0

user2357112
user2357112

Reputation: 282006

the program still counts 'bob' in 'bobs'

It doesn't.

Also this code always returns 0

This is because of your else clause.

        else:
            count = 0

You're resetting the count here. That's not what you want; if the next character isn't a space, you don't want to do anything at all. Remove the whole else clause.

You have an additional bug you haven't noticed. If string ends with substring, the following test:

        if string[i+len(substring)] == ' ':

will attempt to read past the end of the string and throw an IndexError. Try to solve this problem on your own first.

Upvotes: 2

Related Questions