《剑指offer》面试题16:不含重复字符的最长子字符串

"""
题目:输入一个字符串,求该字符串中不含重复字符的最长子字符串的长度。
     例如,输入字符串’babcca',其最长的不含重复字符的子字符串是‘abc’,长度为3
解题思路:解该题的核心思想是,如何通过恰当的双指针移动来截取子字符串。至于子字符串中是否包含重复字符这都很好判断。
        如何恰当的通过双指针截取子字符串呢?P1的起始位置为0,P2的起始位置为1.
        首先判断P1-P2是否有重复字符,如果没有,则持续右移P2,并使用列表T1记录下每个无重复字符的子字符串的长度
        直到发现P1-P2有重复字符,则P2不动,将P1右移,直到P1-P2没有重复字符,
        如此循环,直到P2到达字符串末尾+1。然后去T1中的最大值就是最长无重复子字符串的长度.
        注意这个结束循环的判断条件,是需要好好思考的。
"""


def no_repeat(t):
    length = len(t)
    t_list = list(t)
    p1, p2 = 0, 1
    # no_repeat_length负责记录无重复字符的子字符串的长度
    no_repeat_length = []
    while p2 != length+1:
        sub_t = t_list[p1:p2]
        if len(sub_t) == len(set(sub_t)):
            no_repeat_length.append(p2-p1)
            p2 += 1
        else:
            p1 += 1
    return max(no_repeat_length)


t = 'babccabfg'
t2 = 'sdsasdssbfsddfhjkiuowewewe'
t3 = 'abcdefffffff'
print(no_repeat(t))
print(no_repeat(t2))
print(no_repeat(t3))
上一篇:pytest测试框架系列 - Pytest pytest-repeat 重复执行用例插件详解


下一篇:实践案例-五彩导航条