首页 > 其他分享 >Leecode热题100-3.无重复字符最长子串

Leecode热题100-3.无重复字符最长子串

时间:2024-10-05 12:49:23浏览次数:9  
标签:子串 字符 重复 maxLen Leecode sArr 长度 100 热题

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

子串

 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

本来应该用滑动窗口,我觉得太麻烦了,所以用了哈希表

class Solution {
    /**这个题按照官方的指导方法应该是滑动窗口,但是这个我这里用的不是滑动窗口
    整体的解题思想是:每遍历一个字符,记录下这个字符最后一次出现的位置,然后这个字符上一次出现的位置到当前位置的长度
    和以上个字符结尾的无重复的最大无重复子串的长度+1中最小的那个就是以当前字符结尾的最大无重复子串的长度
    整个过程利用了一个额外的哈希表 */
    public int lengthOfLongestSubstring(String s) {
        if(s == null ||s.length() == 0) {
            return 0;
        }
        /**如果不是空串,我们使用哈希表求解 */
        Map<Character, Integer> lastOccurMap = new HashMap<>();
        /**转成字符数组求解 */
        char[] sArr = s.toCharArray();
        /**maxLen用来记录答案,因为0位置的值肯定不重复,所以先记录为0位置的值1*/
        int maxLen = 1;
        /**这里记得要放入第一个位置的记录到map里 */
        lastOccurMap.put(sArr[0], 0);
        /**preMax代表的是以上个字符结尾的最大无重复子串的长度 */
        int preMax = 1;
        for(int i = 1; i < sArr.length; i++) {
            int curMax = Math.min(preMax + 1, i - lastOccurMap.getOrDefault(sArr[i], -1));
            maxLen = Math.max(maxLen, curMax);
            /**不要忘了放入哈希表和把curMax赋值给preMax*/
            lastOccurMap.put(sArr[i], i);
            preMax = curMax;
        }
        /**返回过程中记录的答案 */
        return maxLen;
    }
}

标签:子串,字符,重复,maxLen,Leecode,sArr,长度,100,热题
From: https://blog.csdn.net/Chang_Yafei/article/details/142707003

相关文章

  • Cisco Secure Firewall 3100 Series FTD Software 7.6.0 & ASA Software 9.22.1
    CiscoSecureFirewall3100SeriesFTDSoftware7.6.0&ASASoftware9.22.1FirepowerThreatDefense(FTD)Software-思科防火墙系统软件请访问原文链接:https://sysin.org/blog/cisco-firepower-3100/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCiscoSec......
  • CSP-S模拟赛20241004
    A你考虑可以把这个数组当中的每个数表示成另一种形式:\(a_i=k_i\timesx+b\)(其中\(x\)是模数,\(b\)为余数)。对于求两个数是否对于某个余数同余,显然你要判断他们两个的差,即\(a_i-a_j\),那么我们用上面那种形式表示其实就是\(a_i-a_j=(k_i-k_j)\timesx\),所以你要判断整个数......
  • 20241004-顺路
    约莫六点一刻时我和lzm吃完晚饭从食堂出来,我想回机房,他说想去找zyx,我惊讶,并说这又不顺路干嘛去找?但是他执意要找,并表示「在我心里是顺路的」,我便和他一起顺路。来到24班后门门口,lzm探头张望,又马上折回来小声对我说些话,我没听清,只听到什么「跟zyx大声说lzm来找她了」,我......
  • Python常见面试题(100道)
        面试总是让人倍感压力,尤其是在技术领域,准备充分非常关键。为了帮助你更好地应对Python面试,我精心整理了100道经典的Python面试题,并附上详细答案和解析。这些问题涵盖了基础知识、实用技巧和常见难点,旨在提升你的面试能力,让你自信面对挑战。快来领取这份资源,助你顺......
  • 20241003 模拟赛
    这场...打得还行吧。(至少没有爆零A.旋律的总数难度:橙签到题。只要第一个都选\(1\),就能保证不同。答案为\(m^{n-1}\)。#include<bits/stdc++.h>#definelllonglong#definemod1000000007usingnamespacestd;intT;lln,m;llquickpow(lla,llb){llre......
  • 20241003
    公交车(bus)显然的题目,答案就是所有连通块的大小减一之和#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e7+5;intn,m,fa[N],sz[N],ans;intfind(intx){if(fa[x]==x){returnx;}returnfa[x]=find......
  • wsl重装Ubuntu遇到的一些问题( WslRegisterDistribution failed with error: 0x800410
        不知道什么原因,VSCode连接WSLUbuntu总是失败,遂决定重装Ubuntu。    但是卸载原来的Ubuntu后,安装新的Ubuntu报错:WslRegisterDistributionfailedwitherror:0x80041002Error:0x80041002(null),查了比较多的帖子,使用了以下方法最终解决:1.关闭"适用于l......
  • 20241003校模拟
    A纪念一下本人在校模拟用线段树优化dp单杀*900。最小和最大没有本质区别,这里只讨论最小的情况。设\(f_i\)表示前缀\(i\)的答案,显然是要枚举\(j\)使得\((j,i]\)合并成一段:\[f_i=\min\bigg(f_j+\lceil\dfrac{s_i-s_j}{x}\rceil\bigg)\]其中\(s_i=\sum_{i......
  • 1003模拟赛
    \(T1\)(今天也就能总结\(T1\)了\(QAQ\))题面其实我是想到正解了的,但为啥从一百挂到二十了呢因为菜~,先让我们看点东西给定一个序列,给他们同时加一个数,问加完后的绝对值最小的是多少?咋做呢?我们考虑绝对值最小为\(0\),假设我们要加\(sum\),则最好的自然是序列中有\(-sum\),要是没......
  • 20241001
    桌游制造我们可以对于每种图案记录拥有这种图案的有那些圆片,然后我们枚举每一个圆片,枚举这个圆片上面的图案,枚举拥有这种图案的圆片还有哪些,然后分别打上标记,如果有一个圆片明明已经有标记了,然而又要被打一次标记,那么我们可以直接输出\(NO\)如果标记都已经打完了,可还是......