剑指offer实践 ——48.最长不含重复字符的子字符串(python版)



题目

最长不含重复字符的子字符串
在这里插入图片描述


一、思路 双指针+哈希表

例如下列字符串: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

二、思路 动态规划

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值