Finding longest substring in alphabetical order

后端 未结 17 1477
刺人心
刺人心 2020-12-06 15:15

EDIT: I am aware that a question with similar task was already asked in SO but I\'m interested to find out the problem in this specific piece of code. I am

17条回答
  •  情歌与酒
    2020-12-06 15:46

    Python has a powerful builtin package itertools and a wonderful function within groupby

    An intuitive use of the Key function can give immense mileage.

    In this particular case, you just have to keep a track of order change and group the sequence accordingly. The only exception is the boundary case which you have to handle separately

    Code

    def find_long_cons_sub(s):
        class Key(object):
            '''
            The Key function returns 
                1: For Increasing Sequence
                0: For Decreasing Sequence
            '''
            def __init__(self):
                self.last_char = None
            def __call__(self, char):
                resp = True
                if self.last_char:
                    resp = self.last_char < char
                self.last_char = char
                return resp
        def find_substring(groups):
            '''
            The Boundary Case is when an increasing sequence
            starts just after the Decresing Sequence. This causes
            the first character to be in the previous group.
            If you do not want to handle the Boundary Case
            seperately, you have to mak the Key function a bit 
            complicated to flag the start of increasing sequence'''
            yield next(groups)
            try:
                while True:
                    yield next(groups)[-1:] + next(groups)
            except StopIteration:
                pass
        groups = (list(g) for k, g in groupby(s, key = Key()) if k)
        #Just determine the maximum sequence based on length
        return ''.join(max(find_substring(groups), key = len))
    

    Result

    >>> find_long_cons_sub('drurotsxjehlwfwgygygxz')
    'ehlw'
    >>> find_long_cons_sub('eseoojlsuai')
    'jlsu'
    >>> find_long_cons_sub('hixwluvyhzzzdgd')
    'luvy'
    

提交回复
热议问题