Longest Substring without Repeating Characters

本文介绍了一种解决LeetCode上“最长无重复字符子串”问题的方法。通过记录字符串中每个字符的位置,利用start和m两个变量确定无重复字符子串的最大长度。start用于标记可能的子串起始位置,而m则用来记录历史上的最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目详情:https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

自己写的代码,主要思路就是:存储字符串中每个元素的位置;如果当前字符c在前边出现过,设为start,那么取的该位置,并更新c的位置,设为nowPos。这里有个变量m,m存储”历史上”start的最大值,程序需要根据m的值来确定start的值,如果m的值较大,那么字符串s中从start到nowPos之间必定有重复元素,所以需要将m的值赋给start,以保证[start,nowPos]之间没有重复元素。

#-*- coding:utf-8 -*-
class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        i,j,length=0,0,len(s)
        maxLength,pos,d=0,{},{}
        start,m=0,-1
        while i<length:
            if pos.get(s[i])==None:#如果s[i]没有出现过
                pos[s[i]]=i #添加到d中
            else:#s[i]已经在d中了
                start=pos[s[i]]+1#获得上一次出现s[i]的位置
                pos[s[i]]=i#更新s[i]出现的位置
                if start<m:#m存储无重复元素的可能子串的最大下标,如果start<m
                    start=m#那么s[start:i+1]肯定有重复元素
                elif start>m:#如果start>m
                    m=start  #更新s
            dis=i-start+1#求出这次无重复元素子串的长度,start为子串的开始位置
            if dis>maxLength:#如果dis较大
                maxLength=dis#那么更新最大长度的值
            i=i+1
        return maxLength
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值