【剑指offer】最长不含重复字符的子字符串 python

988 阅读1分钟

【题目描述】

题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含’a’~'z’的字符。例如,在字符串"arabcacfr"中,最长的不含重复字符的子字符串就是"acfr",长度为4。

【思路解析】

动态规划法解决,考虑以第i个字符为结尾的不含重复字符的子串长度f(i)时,主要根据f(i-1)做判断,

1)如果第i个字符上一次出现的位置,在f(i-1)所确定的子串中,那么按照出现的位置与第i个字符的距离更新f(i)

2)如果第i个字符上一次出现的位置不在f(i-1)所确定的子串之中,或者之前根本没有出现过,那么f(i)=f(i-1)+1

这样做的时间复杂度为O(n),为了解决空间复杂度,利用哈希法,一个列表来保存26个字母,每个字母最近一次出现的位置,使得空间复杂度为O(1)。

ord函数:返回字符对应的 ASCII 数值,主要用于哈希过程。

【代码】

python:

def longeststring(input):
    last_position=[-1 for i in range(26)]
    max_len,cur_len=0,0
    for i in range(len(input)):
        idx=last_position[ord(input[i])-ord('a')]
        if idx==-1 or idx<i-cur_len:
            cur_len+=1
        else:
            cur_len=i-idx
        max_len=max(cur_len,max_len)
        last_position[ord(input[i])-ord('a')]=i
    return max_len