leetCode第三题 无重复字符的最长子串

学习他人答法
解题思路
举个例子,字符串S=“abc”,其无重复最长子串是’abc’,那么再在字符串‘abc’后加个字符’d’,变成字符串S1’‘abcd’,其无重复最长子串是什么?

S结尾加上’d’之后,最长无重复子串有两种可能:
最长无重复子串包含新增的’d’,即’cd’
最长无重复子串不包含新增的’d’,即S1的最长无重复子串’abc’
比较’cd’与’abc’,len(‘abc’)>len(‘cd’),所以S1的最长无重复子串依然是’abc’

所以已知一个字符串Si,其长度为L,在Si末尾加入字符‘C’,即Si+1=Si+C,那么Si+1的最长子串就是:
length(Si+1)=max(L,len(以C结尾的无重复子串))

查找新增字符结尾的无重复子串长度是向左搜索,再求以s为结尾的无重复子串长度,接下来再考虑特殊情况字符串为0和1

代码:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if s == '':
            return 0
        if len(s) == 1:
            return 1

        def find_left(s, i):
            tmp_str = s[i]
            j = i - 1
            while j >= 0 and s[j] not in tmp_str:
                tmp_str += s[j]
                j -= 1
            return len(tmp_str)
        length = 0
        for i in range(0, len(s)):
            length = max(length, find_left(s, i))
        return length
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值