• 【每日一题】leetcode3无重复字符的最长子串


    题目描述

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

    示例

    输入: s = "abcabcbb"

    输出: 3 

    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

    题目分析

    要求从字符串中找到最长的不含重复字符的子串,那么就存在一个区间[start,end],在这个区间内,每个字符不重复且长度最长。怎么找到这个区间呢?首先设置两个指针start和end,start指向区间开始,end指向区间结束,初始都指向s开始,同时我们需要知道字符是否出现过,此时申请一个set,记录start-end出现的字符,向右移动end指针,若没有出现,则加入该字符入set,继续向右移动,若已经出现,此时需要移动start指针的位置到之前该字符出现位置的下一个位置,继续移动end,这个方法有个官方的名字--滑动窗口。下面图解一下,更直观。

    解法1

    public int lengthOfLongestSubstring(String s) {
        //如果长度<=1直接返回
        if (s.length() <= 1) {
            return s.length();
        }
        //开始指针和结束指针均指向第一个位置
        int start = 0, end = 0;
        Set<Character> set = new HashSet<>();
        int max = 1;
        set.add(s.charAt(start));
        ++ end;
        while (start <= end && end < s.length()) {
            if (set.contains(s.charAt(end))) {
                //如果区间内出现过
                int ans = end - start;
                max = Math.max(max, ans);
                //将之前字符前的全部移除出去
                while(start < end && s.charAt(start) != s.charAt(end)) {
                    set.remove(s.charAt(start));
                    ++ start;
                }
                ++ start;
                ++ end;
            } else {
                set.add(s.charAt(end));
                ++ end;
            }
        }
        int ans = end - start;
        max = Math.max(max, ans);
        return max;
    }

    注:公众号每天早上更新哦~欢迎大家关注

  • 相关阅读:
    【MVC 1】MVC+EF实体框架—原理解析
    数据结构导论(一)
    【JavaScript 14—学习总结】:从小事做起
    【JavaScript 13—应用总结】:锁屏遮罩
    【JavaScript 12—应用总结】:弹出登录框
    【JavaScript 11—应用总结】:下拉菜单
    【JavaScript 10—应用总结】:连缀
    【EF 1】EF实体框架 原理+实例
    【多 线 程】
    【命 令 行】
  • 原文地址:https://www.cnblogs.com/lin0/p/15826586.html
Copyright © 2020-2023  润新知