leetcode刷题之3.无重复字符的最长子串

该博客介绍了如何利用Set和Index来解决寻找字符串中无重复字符的最长子串长度的问题。通过移动窗口并更新最大长度,避免了重复字符,例如在输入字符串'abcabcbb'中,最长子串为'abc',长度为3。博客还提到了与滑动窗口最大值问题的解法相似之处,并提供了具体的Java代码实现。

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

题目

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

分析

这道题目和昨天做的239滑动窗口最大值在解法上的思路有相同的地方,那道题使用的是deque来完成的,这道题目使用set和index来完成窗口的移动,效率会高一些。
有几个要点:

  • 使用set来做去重,如果index当前位置的字符已经包含在set里面了,就说明需要移动窗口的起始位置了。
  • 移动窗口之前我们先对当前的set内的字符数量做个统计,更新一下max的值
  • 移动的方法:我们需要将window的起始节点移动到和当前字符重复的字符的后一个字符的位置上
    比如
    sliding window
    当index目前走到2的位置,和1位置上的w有冲突,起始位置由原来的0移动到2的位置。同理下面的h有冲突的话也还是移动到e的位置。
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.size() <= 1) return s.size();
        //使用一个map来去除重复
        set<char> se;
        //定义一个最大值的变量
        int max = 0;
        int head = 0;
        for(char c : s) {
            if (se.count(c) > 0) {
                //更新一下长度
                if(max < se.size()) {
                    max = se.size();
                }   
                while (c != s[head]) { 
                    se.erase(s[head]);
                    head ++;  
                }
                //c==s[head]的时候不剔除但是head要右移
                head ++;
            }else {
                se.insert(c);
            }
        }
        if(max < se.size()) {
            max = se.size();
        }
        return max; 
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值