This is the code I got so far but it's not working as intended and I'm not sure what's making the problem.
def removeSubstrings(s, sub):
if len(s) == 0:
return ''
if sub == s[0]:
return removeSubstrings(s[1:], s)
else:
return s[0] removeSubstrings(s[1:], sub)
This is the tester program:
from recursion import *
allPassed = True
def removeSubstringsMain():
global allPassed
testCases = [(1, 'abcdef', 'abc', 'def'),
(2, 'abcdef', 'def', 'abc'),
(3, 'abcdef', 'bcd', 'aef'),
(4, 'abcdef', '', 'abcdef'),
(5, 'abcdef', 'abcdef', ''),
(6, 'aabbaabb', 'aa', 'bbbb'),
(7, 'abcdef', 'xyz', 'abcdef'),
(8, 'aabbaabb', 'a', 'bbbb')]
for num, message, substring, expected in testCases:
result = removeSubstrings(message, substring)
if result != expected:
print(f'Remove Substrings Test {num} Failed. Expected {expected} got {result}')
allPassed = False
def main():
removeSubstringsMain()
# closestMain() ignore
# strDistMain() ignore
if allPassed:
print('All tests passed')
main()
This is the error mesagess that's coming from the tester:
Remove Substrings Test 1 Failed. Expected def got abcdef Remove Substrings Test 2 Failed. Expected abc got abcdef Remove Substrings Test 3 Failed. Expected aef got abcdef Remove Substrings Test 5 Failed. Expected got abcdef Remove Substrings Test 6 Failed. Expected bbbb got aabbaabb Remove Substrings Test 8 Failed. Expected bbbb got abbaabb
CodePudding user response:
if sub == s[0]:
tests if the first character is the substring. This will only work if the substring is only 1 character long.
You can use startswith()
to test if the substring is at the beginning of s
. Then you'll need to slice off the entire substring when recursing.
You'll need to treat an empty substring as a base case, since all strings start with an empty string, but removing it doesn't change anything, so that will be an infinite loop.
def removeSubstrings(s, sub):
if len(s) == 0:
return ''
if len(sub) == 0:
return s
if s.startswith(sub):
return removeSubstrings(s[len(sub):], sub)
else:
return s[0] removeSubstrings(s[1:], sub)
CodePudding user response:
Instead of your function removeSubstrings, why not use the inbuilt string replace?
result = message.replace(substring, "")
CodePudding user response:
Looks like someone already gave you a good answer. Here's mine. Similar approach, but using slices larger than one character.
def removeSubstrings(s, sub) -> str:
if len(s) == 0:
return ''
loc = s.find(sub)
if loc == -1 or sub == '':
return s
return removeSubstrings(s[:loc], sub) removeSubstrings(s[loc len(sub):], sub)