PS3: Problem 2 » Solutions
May. 4th, 2010 01:03 pmThe non-recursive version can be done as easily with find as with rfind, so I've shown both. My recursive version uses rfind. If someone has a recursive version that uses find, I'd be curious to see it. I have a theory about why I found rfind necessary to work the recursive version, but it could be way off base; I'd like to find out.
PS 3: Problem 2 » Solutions
# Problem 2: subStringMatchExact (uses find), subStringMatchExact2 (uses rfind),
# subStringMatchExactR (recursivem uses rfind)
def subStringMatchExact( target, key ):
if key:
offsets = ()
offset = target.find( key )
while offset != -1:
offsets += offset,
offset = target.find( key, offset+1 )
else:
# A little something he didn't mention: In Problem 3, if the key
# is a single letter and key1 or key2 is empty, n+m+1 overrun the last
# index and won't return it, even though the last index is an
# acceptable value. Therefore, we have to add an extra index when key
# is empty. INELEGANT!
offsets = range(0, len(target)+1 )
return offsets
def subStringMatchExact2( target, key ):
if key:
offsets = ()
while target.rfind( key ) != -1:
offsets += (target.rfind( key ),)
target = target[:target.rfind( key )]
else:
offsets = range(0, len(target) )
return offsets
def subStringMatchExactR( target, key ):
if key:
if target.rfind(key) == -1:
return ()
else:
offset = target.find(key) + 1
return (target.rfind(key),) + subStringMatchExactR(target[:target.rfind(key)],key)
else:
return range(0, len(target)+1 )