简体   繁体   中英

Find all substrings in a string using recursion Python 3

How would you make a list of all the possible substrings in a string using recursion? (no loops) I know that you can recurse using s[1:] to cut off the first position and s[:-1] to cut off the last position. So far I have come up with this:

def lst_substrings(s):
  lst = []
  if s == "":
    return lst
  else:
    lst.append(s)
    return lst_substrings(s[1:])

but this would only make a list of all the substrings that are sliced by the first position if it worked

Fun problem, here's my solution - feedback appreciated.

Output

In [73]: lstSubStrings("Hey")
Out[73]: ['', 'y', 'H', 'Hey', 'He', 'e', 'ey']

Solution

def lstSubStrings(s):
    # BASE CASE: when s is empty return the empty string
    if(len(s) is 0):
        return [s]
    substrs = []
    # a string is a substring of itself - by the definition of subset in math
    substrs.append(s)
    # extend the list of substrings by all substrings with the first
    # character cut out
    substrs.extend(lstSubStrings(s[1:]))
    # extend the list of substrings by all substrings with the last 
    # character cut out
    substrs.extend(lstSubStrings(s[:-1]))
    # convert the list to `set`, removing all duplicates, and convert 
    # back to a list
    substrs = list(set(substrs))

    return substrs

EDIT: Duh. Just realized now that practically the same solution has been posted by someone who was quicker than me. Vote for his answer. I'll leave this as it is a bit more concise and in case you want to sort the resulting list by substring length. Use len(item, item), ie leave the - sign, to sort in ascending order.

This will do:

def lst_substrings(s):
    lst = [s]
    if len(s) > 0:
        lst.extend(lst_substrings(s[1:]))
        lst.extend(lst_substrings(s[:-1]))
    return list(set(lst))

sub = lst_substrings("boby")
sub.sort(key=lambda item: (-len(item), item))
print(sub)

Output is:

['boby', 'bob', 'oby', 'bo', 'by', 'ob', 'b', 'o', 'y', '']

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM