LeetCode——3. 无重复字符的最长子串(Java)

题目描述

题干:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例1:
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

示例4:
输入: s = ""
输出: 0

题解思路

找到字符串中的最长的不重复子串,这道题我踩了很多坑,在总结里我在赘述吧,这里我们直接说官方给的滑动窗口法

思路就是我们从第一个元素开始,寻找以它为起始地址的第一个无重复字符的子串,然后依次往后循环重复本步骤

为了对得起自己死去的脑细胞和宝贵的时间,我还是得说一说我自己的思路

我首先想到的是双指针的思路,和官方题解的差别就是在我是通过指针移动,而他是通过删除已经遍历过的节点

所以内存消耗会少很多,但是复杂度还是不能与之匹敌,这里给出我自己的代码供大家批评吧

正确代码

    public int lengthOfLongestSubstring1(String s) {
        //排除空指针异常的情况
        if (s.equals("") || s == null) {
            return 0;
        }
        
        Set<Character> set = new HashSet<>();
        int left = 0,right = 0,ans = 0;

        //这个判断条件就显得我的方法很离谱
        //逻辑大概就是不相同就继续遍历,相同就重新从下一个开始
        while (left < s.length() && right < s.length()){
            if (set.add(s.charAt(right))){
                right++;
            }else {
                ans = Math.max(ans,set.size());
                set.clear();
                left++;
                right = left;
            }
        }
        //排除最长子串在最后的情况
        return set.size() > ans?set.size():ans;

总结

这道题踩得坑和新的知识很多,这里我们统一总结一下
  1. 首先就是字符串的 s.equals("") 和 s == null两个判空方法,后者会出现Index 0 out of bounds for length 0异常
  2. 其次是Set set和HashSet set两种定义方法,这其实在另一篇HashMap里说过一次,大同小异,就是为了代码的灵活性
  3. 最后就是说一说Set的两个方法,一个清空clear,一个长度size,还有一个查找是否存在的元素contains这三个没用过的方法

其实我现在依然觉得我的逻辑和他相同,为什么时间上相差如此之久,难道每次我都多了前面重复元素的遍历吗?

如果文章存在什么问题或者想帮我解决疑惑,欢迎大牛们在评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-04-05 11:59  21岁还不是架构师  阅读(182)  评论(0编辑  收藏  举报