题目
最长不含重复字符的子字符串
一、思路 双指针+哈希表
例如下列字符串:pwwkfe
假设两个指针p1,p2分别指向字符串的-1和0。为什么要把p1指针指向-1,是因为在求字符串的长度时,如果字符串只有一位“a”, 那p2=0的时候,就需要计算不重复的最长长度,0-(-1)=1。因此p1这个指针代表的是不重复子串的前一位!!!
开始遍历
p2指针指向’p’,判断’p’是否在d这个字典中,没有压入字典,p2移动至下一个指针。更新当前的最大长度=p2-p1
p2指针指向’w’,判断’w’是否在d这个字典中,没有压入字典,p2移动至下一个指针。更新当前的最大长度=p2-p1
p2指针指向’w’,判断’w’已经在d这个字典中,此时需要移动p1指针指向字典中‘w’的index,p2移动至下一个指针。更新当前的最大长度=p2-p1
p2指针指向’k’,判断’k’不再在d这个字典中,没有压入字典,p2移动至下一个指针。更新当前的最大长度=p2-p1
p2指针指向’e’,判断’e’不再在d这个字典中,没有压入字典,p2移动至下一个指针。更新当前的最大长度=p2-p1
p2指针指向’f’,判断’f’不再在d这个字典中,没有压入字典,p2移动至下一个指针。更新当前的最大长度=p2-p1
这是判断p2已经越界了~~所以比较也完成了。此时p2-p1 = 4
所以最长不重复子串 的长度为4 ~
p1指向的下一个位置就是最长不重复子串开始的位置~
def longest_sub_str_1(s):
if not s or len(s) == 0:
return 0
d = {}
p1,p2 = -1,0
max_len = 0
while p1 < len(s) and p2 < len(s):
if s[p2] in d:
p1 = max(p1, d[s[p2]])
d[s[p2]] = p2
max_len = max(p2 - p1, max_len)
p2 += 1
return max_len