solution_182b.py

#!/usr/bin/python3
# ====================================================================
# two pointers - find the longest substring of the same character
# ====================================================================

# --------------------------------------------------------------------
# ---- find the next single character substring starting at idxa
# ---- (start and end indexes)
# --------------------------------------------------------------------

def next_substring(idxa: int,string: str) -> tuple:
    ''' find the next single character substring'''
    slen = len(string)
    idxb = idxa
    while True:
        if idxb >= slen or string[idxa] != string[idxb]:
            ssstr = string[idxa:idxb]
            sslen = len(ssstr)
            return (idxa,idxb-1,sslen,ssstr)
        idxb += 1


# --------------------------------------------------------------------
# ---- find the longest single character substring
# ---- (first one if there are duplicate lengths)
# ---- loc = (strt_index, end_index, length)
# --------------------------------------------------------------------

def longest_substring(string: str) -> tuple:
    ''' find the first longest single character substring'''

    idxa: int   = 0             # start next substring search index
    loc:  tuple = (0,0,0)       # longest substring location

    # ---- is there a string?

    if len(string) < 1: return loc

    # ---- process the string

    while True:

        (idxa,idxb,sublen,substr) = next_substring(idxa,string)

        ##print(f'next_substr: idxa={idxa} idxb={idxb} ' +\
        ##      f'sslen={sublen} ssstr="{substr}"')

        if sublen > loc[2]: loc = (idxa,idxb,sublen)
    
        if idxb+1 >= len(string): break

        idxa = idxb + 1

    return loc

# --------------------------------------------------------------------
# ---- main
# --------------------------------------------------------------------

if __name__ == '__main__':

    # ---- longest sequence character is "v"
    # ---- location is index 32 to 37 (inclusive)
    # ---- length 6
    # ----                    1         2         3         4
    # ----          012345678901234567890123456789012345678901
    bigstr: str  = 'aghrsssssdsfgggghaannozzxzttrrrrvvvvvvzzzz'

    scale0 = '0         1         2         3         4         5'
    scale1 = '012345678901234567890123456789012345678901234567890'

    strings: str = ['','a','aaa','abbc','aabbbcc','xyzzzz',
                    'xyz','xyyzz','xxyyz','abcc','aaabc',bigstr]
    
    for string in strings:

        print()
        print('---- TEST STRING ------------------------------------')
        ##print(f'----        {scale0}')
        ##print(f'----        {scale1}')
        print(f'string   : "{string}"')

        if len(string) < 1:
            print('empty string')
            continue
        
        loc = longest_substring(string)

        print(f'substring: "{string[loc[0]:loc[1]+1]}"')
        print(f'location : {loc}')