LeetCode(3)Longest Substring Without Repeating Characters

本文介绍了一种求解字符串中最长无重复字符子串的高效算法。利用数组记录子串长度,通过哈希表存储字符位置,实现O(N)时间复杂度。适用于LeetCode上的相关题目。

原问题链接:https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description

问题定义:给定一个字符串,求出没有重复字母的最长子串。

思路:O(N^2)的算法最后一个测试用例无法通过,所以用空间换时间的思想。设字符串为s,使用一个数组L来保存以下标i所在字母为最后一个字母且没有重复字母的字符串的最大长度,使用HashMap(dic)来存储每一个字母在字符串中上一次出现的下标,遍历字符串,同步更新L和dic

时间复杂度:O(N)

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        max_num,L,dic=0,[],{}
        if(len(s)>0):
            L.append(1)
            max_num,dic[s[0]]=1,0
        for i in range(1,len(s)):
            if s[i] in dic:
                if i-dic[s[i]]>L[i-1]:
                    L.append(L[i-1]+1)
                else:
                    L.append(i-dic[s[i]])
                dic[s[i]]=i
            else:
                dic[s[i]]=i
                L.append(L[i-1]+1)
            max_num=max(max_num,L[i])
        return max_num



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值