Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >刷题记录(LeetCode 100 热题系列)2

刷题记录(LeetCode 100 热题系列)2

原创
作者头像
猎户星座1
修改于 2021-01-18 06:25:13
修改于 2021-01-18 06:25:13
34200
代码可运行
举报
文章被收录于专栏:Java StudyJava Study
运行总次数:0
代码可运行

文章谨记录自己的刷题过程,思路,仅目的用于自己的思路记录。

无重复字符的最长子串 LeetCode url (https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 3:

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

题目有种之前做过,但是提交的时候是发现自己没有做过的,

自己的思路有点想 for for 两个for 循环 -》 第一个for循环用于向下遍历字符串的每一位数 -》for 循环内去处理这层循环要处理的逻辑 (也就是内层循环去判断是否以 外循环的数值为起始位的子串,一旦出现重复就记录一下这次循环的子串长度) -》

比较每次以不同位置为起点的子串长度 -》 能得到max 子串长度

自己是用内循环中每次 new string() 的方式,作为容器去记录每次内循环的子串长度,把判断方式抽取出了就成了大家所的滑动窗口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public int lengthOfLongestSubstring(String s) {
         int max = 0;
         char[] chars =  s.toCharArray();
        
        if(chars.length <=1 )
            return chars.length;

        for (int i =0 ; i< chars.length; i++ ){
            String maxString = "";
            for(int j = i; j< chars.length ; j++){

                if (maxString.indexOf(chars[j]) == -1 ){
                    maxString = maxString + chars[j];
                }else{
                    break;
                }
            }
             max = max > maxString.length() ?  max : maxString.length();
        }
              
        return max;
    }

自己也是看了leetcode 的官方解题才发现了自己的思路 和 官方也就是所谓的滑动窗口是这样的,滑动窗口这种解决办法出现的意义就是可以替代每次不维持滑动窗口的重复的创建从特定位置的开始的“窗口”。

官方题解:每次向右移动,减少窗口中的数据,更像是解决我 每次在内循环中要的坐标向右移动更新, 计算的都是内循环中 移动后的子串长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public int lengthOfLongestSubstring(String s) {
    
        int max = 0;
        if(s.length() <=1)
          return  s.length();

        int r = -1 ;  
        Set<Character>  set  = new HashSet();

        for(int i =0 ; i< s.length(); i++){
            if(i != 0){
                set.remove(s.charAt(i-1));
            }
            while(r+1 < s.length() && !set.contains(s.charAt(r+1))){
                // 不断移动右指针
                set.add(s.charAt(r+1));
                r++;
            }
            // 第i 到 r 位置的元素是一个 无重复的字符子串
            max = Math.max(max,r-i +1);
        }

        return max;
        

    }

map里面存放的为不会重复数字的窗口,因此移动时判断的是 map 维护的是 只要移动过程中出现了冲突的数据,就要更新左侧的数据,不需要像多次的判断 减少循环。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int lengthOfLongestSubstring(String s) {
    
        if(s.length() <=1 )
           return s.length();

        HashMap<Character ,Integer>  map =  new HashMap<Character ,Integer>();  
        int max = 0;
        int left = 0;

        for(int i = 0 ; i< s.length(); i++ ){
            if (map.containsKey(s.charAt(i))){
                left =Math(left, map.get(s.charAt(i))+1);
            }
            // 如果相等的话就会被覆盖掉, 不相等就要被set 进去    
            map.put(s.charAt(i),i);
            max = Math.max(max , i-left +1);
        }
        return max;

    }

所以纯粹上的 滑动窗口还是利用hashmap 去实现的。

滑动窗口总结系列 https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-dong-chuang-kou-by-powcai/

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
003. 无重复字符的最长子串 | Leetcode题解
题目要求连续, 我们考虑使用滑动窗口。而这道题就是窗口大小不固定的滑动窗口题目,然后让我们求满足条件的窗口大小的最大值,这是一种非常常见的滑动窗口题目。
苏南
2020/12/16
5840
003. 无重复字符的最长子串 | Leetcode题解
双指针/滑动窗口/移动队列
Never stop learning, beacuse life never stops teaching. 不要停止学习, 因为人生总有东西可教 there is always more you don`t know. 无重复字符最长子串 双指针/滑动窗口/移动队列 无重复字符最长子串 package cn.com.codingce.aaclengthoflongestsubstring; import java.util.Arrays; import java.util.HashMap; impor
后端码匠
2021/08/20
6690
最长子字符串
1、 第一种方式,时间复杂度 n3,这种方式在实际情况下是不可取的。 2、时间复杂度:O(2n) = O(n)O(2n)=O(n),在最糟糕的情况下,每个字符将被 ii 和 jj 访问两次。空间复杂度:O(min(m, n))O(min(m,n)),与之前的方法相同。滑动窗口法需要 O(k)O(k) 的空间,其中 kk 表示 Set 的大小。而 Set 的大小取决于字符串 nn 的大小以及字符集 / 字母 mm 的大小。
OPice
2020/04/01
4470
画解算法 3-无重复字符的最长子串
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
灵魂画师牧码
2019/06/27
3770
画解算法 3-无重复字符的最长子串
LeetCode 3: 无重复字符的最长子串
Given a string, find the length of the longest substring without repeating characters.
爱写bug
2019/12/02
5300
LeetCode【3】-- 无重复字符的最长子串
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
秦怀杂货店
2022/02/15
2850
L_00003_LengthOfLongestSubstring:MAP滑窗解决最长非重复字串
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/submissions/
mingjie
2022/05/12
1780
leetcode刷题(3)——无重复字符的最长子串
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2:
老马的编程之旅
2022/06/22
2170
LeetCode-3 无重复字符的最长子串
LeetCode前几道题都是经典题,今天我们学习第3题无重复字符的最长子串,这道题在秋招面试中遇见过,再次相遇,如此亲切。下面我们看看这道题的题目描述。
用户3470542
2019/06/26
4680
LeetCode-3 无重复字符的最长子串
LeetCode 03:面试关:如何找出字符串中无重复最长子串?
LeetCode第3题,“无重复字符的最长子串”,曾经面试的过程中遇到过的一道算法题。通过这道题,我们能够学到算法中一个比较常见的解题方法:滑动窗口算法。
程序新视界
2021/01/29
4120
LeetCode 03:面试关:如何找出字符串中无重复最长子串?
滴滴一面,有点。。。
这题是 LeetCode 的第 3 题,难度为中等,非常经典的滑动窗口题,但得借助哈希表来处理,有同学在滴滴面试过程中遇到过这题,只不过加了一个限制--不能使用 hashmap,大家可以思考一下加了这个限制代码应该怎么改。
五分钟学算法
2023/12/12
2040
滴滴一面,有点。。。
LeetCode3.滑动窗口: 双指针法(Kotlin语言)-无重复字符的最长子串
输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
一个会写诗的程序员
2020/04/24
7510
图解LeetCode第 3 号问题:无重复字符的最长子串
LeetCode上第 3 号问题:Longest Substring Without Repeating Characters。
五分钟学算法
2018/12/25
2.9K0
LeetCode Problem 3: Longest Substring Without Repeating Characters
Given a string, find the length of the longest substring without repeating characters.
剑影啸清寒
2019/05/26
3830
Python 版 LeetCode 刷题笔记 #3 无重复字符的最长子串
今天这题目乍一看,在字符串中找来遍历即可,但实际操作下来,还是有些复杂的,也配得上其中等难度的定位了。
TTTEED
2020/07/08
8190
尺取法
尺取法,顾名思义像尺子那样一段一段取,该算法是滑动窗口的一种,其大思路为首先以某种策略移动右边界,再移动左边界。其效果很像毛毛虫蠕动过程,头先往前跑跑到一定位置,亦巴再往前跑。因此该算法又被称为毛毛虫算法。如下图小姐姐那样
你的益达
2020/08/10
4910
LeetCode热题100(滑动窗口篇)
这种子串子数组问题,而且还满足窗口的右边界右移动就是加,左边界右移就是减的问题大概率就是滑动窗口。
Yui_
2025/01/17
1450
LeetCode热题100(滑动窗口篇)
LeetCode算法题 顶
第1题https://leetcode-cn.com/problems/two-sum/
算法之名
2020/03/19
3320
滑动窗口
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处 最后编辑时间为: 2021/11/02 08:18
用户9347382
2022/01/10
1.1K0
LeetCode3--无重复前缀的最长子串(java实现)
一、问题引入: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,
别团等shy哥发育
2023/02/27
2720
LeetCode3--无重复前缀的最长子串(java实现)
相关推荐
003. 无重复字符的最长子串 | Leetcode题解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档