Leetcode——3. Longest Substring Without Repeating Characters

本文介绍了一种利用滑动窗口算法求解最长无重复子串的问题,通过左右指针移动来更新最大长度。

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

1. 概述

Given a string, find the length of the longest substring without repeating characters.

Examples:

Given "abcabcbb", the answer is "abc", which the length is 3.

Given "bbbbb", the answer is "b", with the length of 1.

Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring"pwke" is a subsequence and not a substring.

这道题需要求取的是在一个字符串中,最长的非重复子串。想到的便是记录扫描过的元素添加到集合中,若是判断新加如的字符与之前的重复了,那么就删除字符,直到不重复为止,在这个过程中记录最大的长度。
这里使用到的方法是 滑动窗口算法(Slide Window Algorithm)求解,和 Minimum Size Subarray Sum 相似。
设下标 l 和 r, 把左开右闭 [l, r) 想象成一个窗口。
当 s[r] 和窗口内字符重复时, 则 l 向右滑动,缩小窗口。
当s[r] 和窗口内字符不重复时,则 r 向右滑动,扩大窗口,此时窗口内的字符串一个无重复子字符串。
在所有的无重复子字符串中,找到长度最大的,即为原问题解。

2. 编码

class Solution {
public:
    int lengthOfLongestSubstring(string s)
    {
        if("" == s) return 0;   //空串
        if(1 == s.length()) return 1;   //只有一个字符
        if(2==s.length() && s.at(0)!=s.at(1)) return 2;
        
        int left(0), right(1), len(s.length()), max_len(1);
        unordered_set<int> setv;
        setv.insert(s.at(left));
        
        while(right < len)
        {
            if(setv.count(s.at(right)) != 0)
            {
                setv.erase(s.at(left));
                ++left;
            }   //在集合中删除元素,直到没有与当前字符重复的时候
            else
            {
                setv.insert(s.at(right));
                ++right;
                max_len = max(max_len, (int)setv.size());   //记录最大的长度
            }
        }
        
        return max_len;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值