leetcode第三题(longestsubstringwithoutrepeatingcharacters)三部曲之二:编码实现(代码片段)

程序员欣宸 程序员欣宸     2022-11-30     153

关键词:

欢迎访问我的GitHub

  • 本文是《LeetCode第三题(Longest Substring Without Repeating Characters)三部曲》的第二篇,前一篇文章已经列出了完整的解题思路,今天来将此思路转化为具体的Java代码;

关键变量

  • 编码之前先确定几个关键变量:
  • 当前窗口中的元素都是不重复的,适合用一个HashSet来保存;
  • max变量记录最长子串的长度;
  • left表示窗口左侧相对整个字符串的位置,right表示窗口右侧相对整个字符串的位置,如下图:

代码实现

  • 以下是代码,关键位置都有详细注释:
public class Solution1 

    public int lengthOfLongestSubstring(String s) 
        //窗口的起始位置,窗口的结束为止,最长记录
        int left = 0, right = 0, max = 0;

        //表示窗口内有哪些值
        Set<Character> set = new HashSet<>();

        while (right < s.length()) 
            //例如"abcdc",窗口内是"abcd",此时right等于[4],
            //发现窗口内有array[right]的值,就缩减窗口左边,
            //缩到窗内没有array[right]的值为止,
            //当left一路变大,直到left=3的时候,窗口内已经没有array[right]的值了
            if (set.contains(s.charAt(right))) 
                //假如窗口内是"abc",当前是"c",那么下面的代码只会将"a"删除,left加一,再次循环
                //而新一次循环依旧发现"c"还在set中,就再把"b"删除,left再加一...
                set.remove(s.charAt(left++));
             else 
                //窗口内没有array[right]的时候,就把array[right]的值放入set中,表示当前窗口内有哪些值
                set.add(s.charAt(right++));

                if ((right - left) > max) 
                    max = right - left;
                
            
        

        return max;
    

    public static void main(String[] args) 
        System.out.println(new Solution1().lengthOfLongestSubstring("abcabcbb"));
    
  • 上述代码的关键是set.remove(s.charAt(left++)),配合着外面的while循环,"left++"表示将窗口向右移动一个元素,并且将窗口中最左侧的元素从set中删除;

  • 上述代码在LeetCode上提交成功,不过运行时间超过40ms,成绩并不理想,接下来的文章我们一起来做优化提升速度;

欢迎关注51CTO博客:程序员欣宸

算法入门01线性枚举(简单-第三题)leetcode876(代码片段)

...0c;和我一起打卡!🌞《光天化日学C语言》🌞LeetCode太难?上简单题!🧡《C语言入门100例》🧡LeetCode太简单?大神盘他!🌌《 查看详情

第一次leetcode周赛总结(代码片段)

...批办法枚举导师的排列组合(大佬的姿势唠嗑第一次参加leetcode周赛,心情有点小激动,给我的感觉是,前两题送分,第三题可能暴力枚举,也可能是dp,第四题上难度,代码量迅速上升。这次的周赛ÿ... 查看详情

第三题

查看详情

可信考试第三题-20220722

/**Copyright(c)HuaweiTechnologiesCo.,Ltd.2019-2020.Allrightsreserved.*Description:上机编程认证*Note:缺省代码仅供参考,可自行决定使用、修改或删除*只能importGo标准库 查看详情

第三题(非实验5)

#ifndefBOOK_H#defineBOOK_H#include<string>usingstd::string;classBook public: Book(stringisbnX,stringtitleX,floatpriceX):isbn(isbnX),title(titleX),price(priceX) voidprint(); private: string 查看详情

c_cpp第三题(代码片段)

查看详情

java实验九第三题

答案我也是嫖的!https://blog.csdn.net/qq_37246345/article/details/1032650371importjava.io.BufferedReader;2importjava.io.BufferedWriter;3importjava.io.File;4importjava.io.FileInputStream;5importjava.io.FileWri 查看详情

java实验九第三题

答案我也是嫖的!https://blog.csdn.net/qq_37246345/article/details/1032650371importjava.io.BufferedReader;2importjava.io.BufferedWriter;3importjava.io.File;4importjava.io.FileInputStream;5importjava.io.FileWri 查看详情

软件测试section1.2.exercises第三题

publicintfindLast(int[]x,inty){//Effects:IfX==nullthroNullPointerException//elsereturntheindexofthelastelement//inxthatequalsy.//Ifnosuchelementexists,return-1for(inti=x.length-1;i>0;i--){if(x[i]== 查看详情

2014百度之星资格赛第三题

XorSumTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:132768/132768K(Java/Others)TotalSubmission(s):7837    AcceptedSubmission(s):3350ProblemDescriptionZeus和P 查看详情

bzoj4929:第三题

Description给定n,b,c,d,e以及A0,A1,···,An−1,定义xk=b×c^4k+d×c^2k+ef(x)=Sigma(Aix^i),0<=i<=n-1请你求出f(x0),f(x1),···,f(xn−1)对10^6+3取模的值。Inp 查看详情

test20181016b君的第三题(代码片段)

题意B君的第三题(haskell)题目描述大学四年,我为什么,为什么不好好读书,没找到和你一样的工作。B君某天看到了这样一个题,勾起了无穷的回忆。输入(n,k)和一棵(n)个点的树,有边权,没有点权。两点(i,j)之间的距离(D(i,j))定... 查看详情

16年第七届蓝桥杯第三题_

方格填数如下的10个格子  +--+--+--+  |  |  | |+--+--+--+--+|  | |  | |+--+--+--+--+|  | |  |+--+--+--+(如果显示有问题, 查看详情

回文素数-2015校内选拔第三题

10301是个5位的素数。它有个特点,把数字倒过来还是它本身,具有这样特征的素数,我们称之为:回文素数。105011060111311这些都是5位的回文素数。请你计算一下,像这样的5位数的回文素数,一共有多少个?请填写这个表示个数... 查看详情

c高级第一次作业函数题第三题

函数题第三题voidsum_diff(floatop1,floatop2,float*psum,float*pdiff)*psum=op1+op2; pdiff=op1-op2; psum,pdiff是地址psum,pdiff是值,所以对op1,op2做和差分别交给psum,*pdiff。*psum,*pdiff分别指向op1,op2的和差. 查看详情

test20181018b君的第三题(代码片段)

题意B君的第三题(shenyang)题目描述客似云来,万里无云B君得到了一个数组(a_1,a_2,dots,a_n)。B君想通过修改让数组中个每对数都互质。每次使一个数+1或者-1的代价是1。不能将(a_i)修改为0或者负数。问至少多少代价才可以让所有数两... 查看详情

看雪.tsrc2017ctf秋季赛第三题

看雪.TSRC2017CTF秋季赛第三题wp这是一道很简单的题,反调试的坑略多。这道题采用了很多常用的反调试手段,比如调用IsDebuggerPresent、进程名检查等等。另外也有利用SEH的非常规检测方法。现在的OD插件能轻松对付常规反调试,暗... 查看详情

test20181019b君的第三题(代码片段)

题意B君的第三题(urumqi)题目描述风雨如晦,鸡鸣不已。B君最近在研究自己的学长都在做什么工作,每个学长属于一个公司。B君会获得一些信息,比如x和y在相同公司,x和y在不同公司。如果当前信息和之前记住的所有信息都不矛... 查看详情