前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现

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

作者头像
程序员欣宸
发布2019-05-29 15:55:21
4490
发布2019-05-29 15:55:21
举报
文章被收录于专栏:实战docker实战docker

本文是《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)三部曲之三:两次优化》;

关键变量

编码之前先确定几个关键变量:

  1. 当前窗口中的元素都是不重复的,适合用一个HashSet来保存;
  2. max变量记录最长子串的长度;
  3. left表示窗口左侧相对整个字符串的位置,right表示窗口右侧相对整个字符串的位置,如下图:

代码实现

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

代码语言:javascript
复制
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,成绩并不理想,接下来的文章我们一起来做优化提升速度;

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三部曲完整链接
  • 关键变量
  • 代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档