【题目描述】
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含’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