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

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

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos
  • 本文是《LeetCode第三题(Longest Substring Without Repeating Characters)三部曲》的第二篇,前一篇文章已经列出了完整的解题思路,今天来将此思路转化为具体的Java代码;

三部曲完整链接

  1. 《LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路》;
  2. 《LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现》;
  3. 《LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化》;

关键变量

  • 编码之前先确定几个关键变量:
  • 当前窗口中的元素都是不重复的,适合用一个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,成绩并不理想,接下来的文章我们一起来做优化提升速度;

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关文章
|
8月前
leetcode-89:格雷编码
leetcode-89:格雷编码
56 0
Leetcode 516. Longest Palindromic Subsequence
找到一个字符串的最长回文子序列,这里注意回文子串和回文序列的区别。子序列不要求连续,子串(substring)是要求连续的。leetcode 5. Longest Palindromic Substring就是求连续子串的。
58 0
|
Java
Leetcode 3. Longest Substring Without Repeating Characters
此题题意是找出一个不包含相同字母的最长子串,题目给出了两个例子来说明题意,但这两个例子具有误导性,让你误以为字符串中只有小写字母。还好我是心机boy,我把大写字母的情况也给考虑进去了,不过。。。。字符串里竟然有特殊字符,于是贡献了一次wrong answer,这次我把ascii字符表都考虑进去,然后就没问题了。这个故事告诫我们在编程处理问题的时候一定要注意输入数据的范围,面试中可以和面试官去确认数据范围,也能显得你比较严谨。
58 3
|
程序员
【Leetcode】225. 用队列实现栈、232. 用栈实现队列
【Leetcode】225. 用队列实现栈、232. 用栈实现队列
117 0
【Leetcode】225. 用队列实现栈、232. 用栈实现队列
|
存储 前端开发 算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
178 0
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
|
索引 Python
LeetCode 820. 单词的压缩编码 Short Encoding of Words
LeetCode 820. 单词的压缩编码 Short Encoding of Words
|
算法 Python
LeetCode 1160. 拼写单词 Find Words That Can Be Formed by Characters
LeetCode 1160. 拼写单词 Find Words That Can Be Formed by Characters
LeetCode 1160. 拼写单词 Find Words That Can Be Formed by Characters
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行