My code isn't efficient, but it's not convoluted which is rare for me. I wrote a helper function, 'slicer', which iterates over the length of a and slices a into length n substrings. 'Substrings' calls 'slicer' makes a and b sets, uses .intersection to get the substrings in common, and then checks for any substrings less than length n and removes them, or that's the idea behind it. Because the substrings shorter than n are pulled out by an if statement, it didn't seem to matter if 'slicer' ran the entire length of a:
def slicer(a, n):
"""Slices string into substrings of length n"""
# buffer for substrings
buffer_subs = []
# iterates over string
for i in range(len(a)):
# slices a into length n substrings and buffers them
buffer_subs.append(a[i:n + i])
return buffer_subs
def substrings(a, b, n):
"""Return substrings of length n in both a and b"""
# calls slicer on string a and b
a_sub = slicer(a, n)
b_sub = slicer(b, n)
# make a_sub and b_sub sets
set_a_sub = set(a_sub)
set_b_sub = set(b_sub)
# combine sets a_sub and b_sub in list
ab_sub = list(set_a_sub.intersection(set_b_sub))
for s in ab_sub:
if len(s) is not n:
ab_sub.remove(s)
return ab_sub
Check50 fails 3 cases:
The 'more detail' link is helpful...
but I can only reproduce 2 of the 3 errors--1 substring in common looks ok to me:
It's returning substrings shorter than n, but I don't know if it's because the if statement is wrong, if slicer iterating thru the entire length of a is behind it (defining the range in terms of n makes the if statement unnecessary, but doesn't help me understand what's wrong), or if the overall approach is just bad. Maybe if the if statement were in slicer, but I don't understand why it would make a difference. This is where I really miss the gdb debugger. Thanks in advance for any help.