Need to print the first occurrence of k-size subsequence, but my code prints the last

Question:

You are given a string my_string and a positive integer k. Write code that prints the first substring of my_string of length k all of whose characters are identical (lowercase and uppercase are different). If none such exists, print an appropriate error message (see Example 4 below). In particular, the latter holds when my_string is empty.

Example: For the input my_string = “abaadddefggg”, k = 3 the output is For length 3, found the substring ddd!
Example: For the input my_string = “abaadddefggg”, k = 9 the output is Didn’t find a substring of length 9

this is my attempt:

my_string = 'abaadddefggg'
k = 3
s=''
for i in range(len(my_string) - k + 1):
    if my_string[i:i+k] == my_string[i] * k:
        s = my_string[i:i+k]
if len(s) > 0:
    print(f'For length {k}, found the substring {s}!')
else:
    print(f"Didn't find a substring of length {k}")
Asked By: Libi

||

Answers:

You need break. When you find the first occurrence you need to exit from the for-loop. You can do this with break. If you don’t break you continue and maybe find the last occurrence if exists.

my_string = 'abaadddefggg'
k = 3
s=''

for i in range(len(my_string) - k + 1):
    if my_string[i:i+k] == my_string[i] * k:
        s = my_string[i:i+k]
        break
        
if len(s) > 0:
    print(f'For length {k}, found the substring {s}!')
else:
    print(f"Didn't find a substring of length {k}")

You can use itertools.groupby and also You can write a function and use return and then find the first occurrence and return result from the function.

import itertools

def first_occurrence(string, k):
    for a, b in itertools.groupby(string):
        lst_b = list(b)
        if len(lst_b) == k:
            return ''.join(lst_b)
    return ''

k = 3
s = first_occurrence(my_string, k=3)
if len(s) > 0:
    print(f'For length {k}, found the substring {s}!')
else:
    print(f"Didn't find a substring of length {k}")
Answered By: I'mahdi

One alternative approach using an iterator:

my_string = 'abaadddefggg'

N= 3

ou = next((my_string[i:i+N] for i in range(len(my_string)-N)
           if len(set(my_string[i:i+N])) == 1), 'no match')

Output: 'ddd'

Answered By: mozway
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.