前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >刷题记录(LeetCode 100 热题系列)2

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

原创
作者头像
猎户星座1
修改2021-01-18 14:25:13
3040
修改2021-01-18 14:25:13
举报
文章被收录于专栏:Java StudyJava Study

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

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

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

代码语言:javascript
复制
示例 3:

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

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

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

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

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

代码语言:javascript
复制
 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
复制

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
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档