LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现

网友投稿 706 2022-10-24

LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现

LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现

欢迎访问我的GitHub

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

关键变量

代码实现

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

public class Solution1 { public int lengthOfLongestSubstring(String s) { //窗口的起始位置,窗口的结束为止,最长记录 int left = 0, right = 0, max = 0; //表示窗口内有哪些值 Set 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博客:程序员欣宸

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:feign 调用第三方服务中部分特殊符号未转义问题
下一篇:SpringBoot定时任务 - 开箱即用分布式任务框架xxl-job
相关文章

 发表评论

暂时没有评论,来抢沙发吧~