首页 > 其他分享 >LeetCode 3 无重复字符的最长子串

LeetCode 3 无重复字符的最长子串

时间:2024-08-14 19:26:21浏览次数:7  
标签:子串 字符 set 队列 最长 长度 LeetCode

题目描述

给定一个字符串 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 由英文字母、数字、符号和空格组成

思路

这道题主要用到思路是:滑动窗口

什么是滑动窗口?

其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动?

我们只要把队列的左边的元素移出就行了,直到满足题目要求!

一直维持这样的队列,找出队列出现最长的长度时候,求出解!

解题步骤

需要定义指针指向滑动窗口左右

定义一个set来保存当前不重复元素集合

循环遍历字符串,条件是没有循环到末尾

当set中没有包含该字符时,就将该字符添加到set中,同时右指针向右移动

当set中已经包含了字符时,就先将set中重复字符移除,同时左指针向右移动

然后获取当前最长的长度,就是当前set长度和当前最长长度中取最大值

如abcabcbb,一开始abc,set中都不包含,添加进set,right从0移动到2

继续移动right=3,set= abc时,如果再添加a,就需要将set中a移除,变成bc,left从0变成1

然后下次循环,set中变成bc,此时right=3,a又不包含在内了,添加进set,变成是bca

依次进行下去

然后计算最长长度即可

代码

class Solution {
     public static int lengthOfLongestSubstring(String s) {
        int left =0;//左指针
        int right=0;//右指针
        int maxLen=0;//最大长度
        //set集合保存不重复字符
        Set<Character> set = new HashSet<>();
        while(right<s.length()){
            //当set不包含重复字符时,添加到set,右指针右移动
            if(!set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right++;
            }else{
                //包含,先将左指针指向的位置元素删除,然后左指针移动
                set.remove(s.charAt(left));
                left++;
            }
            //计算最大长度
            maxLen= Math.max(maxLen,set.size());
        }
      return maxLen;
     }
     
}

标签:子串,字符,set,队列,最长,长度,LeetCode
From: https://blog.csdn.net/lingxiyizhi_ljx/article/details/141155506

相关文章

  • LeetCode 链表两数相加
    题目描述给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。示例1:输入:l1=[2,4,3],......
  • LeetCode216.组合总和lll
    4.组合总和lll(LeetCode216)题目叙述:找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。示例1:输入:k=3,n=7输出:[[1,2,4]]解释:1......
  • leetcode面试经典150题- 380. O(1) 时间插入、删除和获取随机元素
     https://leetcode.cn/problems/insert-delete-getrandom-o1/description/?envType=study-plan-v2&envId=top-interview-150gotypeRandomizedSetstruct{isHavemap[int]inttotalintarr[]int}funcConstructor()RandomizedSet{retur......
  • Android-代码混淆及字符串加密
    代码混淆使用ProGuard&R8一些参考链接Android混淆,新引入的D8、R8改变了什么?sdk打包必备,proguard混淆规则如何配置开启混淆app/build.gradle.android.buildTypesrelease{minifyEnabledtrue//开启混淆proguardFilesgetDefaultProguardFile('proguard-and......
  • C#字符串梳理及练习
    一、字符串API梳理:字符串:字符串不可以被修改,一般调用字符串API的时候使用新的变量来接收usingSystem;usingSystem.Linq;namespace_10.梳理字符串API{internalclassProgram{staticvoidMain(string[]args){//1。......
  • leetcode面试经典150题- 45. 跳跃游戏 II
    https://leetcode.cn/problems/jump-game-ii/description/?envType=study-plan-v2&envId=top-interview-150gopackageleetcode150import"testing"funcTestJump2(t*testing.T){nums:=[]int{5,9,3,2,1,0,2,3,3,1,0,0}res:=j......
  • 字符串算法学习笔记
    注:码风较差,慎读1.hash算法相对于字符串,数字相对来说好处理一些,我们可以考虑把每一个字符串都对应一个数字,这样就可以非常简便地解决字符串的一些问题,而且效率还极高字符串哈希,就是一种可以理解为将字符串映射到一个整数的方法。比如BKDPHash是一种很好的哈希算法,假如字符串为a......
  • c语言转换char字符数组为大写小写
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......
  • Leetcode 234.回文链表
    给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9进阶:你能否用 O(n) 时间复杂......
  • c语言替换字符串 Replace the first ‘oldstr‘ with ‘newstr‘ in ‘srcstr‘
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......