[Leetcode刷题] - LC003 Longest Substring without repating character

news2024/11/26 14:32:02

题目链接

Leetcode 003Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.https://leetcode.com/problems/longest-substring-without-repeating-characters/

题目描述

给定一个字符串,找到最长没有重复字符的子序列substring。

注:这里需要理解substring 和 subsequence 的区别,substring是指连续子串;而subsequence可以是非连续

题目思路

1. Brute Force

通常对于字符串求解符合某些条件的substring, 最简单的思路就是暴力搜索,两层循环即可

代码如下:

 /** Brute force O(N^2) */
        if (s.length()==0) return 0;
        Set<Character> visited = null;
        int max = 1;
    

        for(int i=0; i<s.length(); i++) {
            visited = new HashSet<>();
            visited.add(s.charAt(i));
            int tMax = 1;
            for (int j=i+1; j<s.length(); j++) {
                if (visited.contains(s.charAt(j))) {
                    break;
                }
                visited.add(s.charAt(j));
                tMax++;
            }
            max = Math.max(tMax, max);
        } 

        return max;

时间复杂度:O(N^{2});空间复杂度:O(N)。 

2. 同向双指针 - 滑动窗口

第一种思路也是一种同向双指针,每一次固定起始点指针,然后通过移动终止点指针来进行寻找不重复的子串。你会发现这种两重循环会引来很多不必要可以跳过的搜索。

如下例子,你会发现第二次循环时,从index=1 到 index=3这段是可以跳过的,因为我们知道 index - [0, 3]已经是一段不重复子串,[0,3]之间是不会再有更长的不重复子串的可能。所以我们完全可以跳过这段查找。

abcabb

^     ^     --- 第一次循环

  ^    ^    --- 第二次循环

第一次起始针在a [index=0的位置] , 然后遍历到 后面a [index=3]的位置结束

第二次起始点在 b [index=1的位置],然后遍历到 后面 b [index=4]的位置结束

 利用这个思路就可以优化这个滑动窗口,思路如下

1. 将起始点st固定在开头,然后开始移动终止点ed,移动ed期间记录字符是否使用过

2. 如果字符没有使用过,那么继续移动ed

3. 当发现ed移动到的字符出现重复,那么开始需要移动起始点st,怎么移动st?有两种情况

        a. 重复字符位置在 [st, ed]窗口外边,这时说明窗口内还是不重复,继续移动ed即可

        b. 如果重复字符在窗口内部,那么需要将起始点st移动到重复字符位置+1

4. 整个过程中不断更新不重复子串的长度即可

代码如下:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int[] chr = new int[128];
        Arrays.fill(chr, -1);
        if (s.length()==0) return 0;

        int st = 0;
        chr[s.charAt(st)-' '] = 0;
        int max = 0;
        int ed = 1;

        for (; ed<s.length(); ) {
            if (chr[s.charAt(ed)-' ']==-1) {
                /** no duplicate */
                chr[s.charAt(ed)-' '] = ed;
                ed++;
            } else {
                if (chr[s.charAt(ed)-' '] == ed) {
                    ed++;
                } else {
                    if (chr[s.charAt(ed)-' '] < st) {
                        chr[s.charAt(ed)-' '] = ed;
                        ed++;
                    } else {
                        max = Math.max(max, ed-st);
                        st = chr[s.charAt(ed)-' ']+1;
                        chr[s.charAt(ed)-' '] = ed;
                    }
                }
            }
        }

        if (st!=ed) {
            max = Math.max(max, ed-st);
        }

        return max;
    }
}

时间复杂度:O(N);空间复杂度:O(128) = O(1),通过数组来保存ASCII码字符串大大降低空间复杂度。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字先锋 | 随时随地云端阅片,“云胶片”时代来啦!

作为现代医疗必不可少的诊断方法&#xff0c;医学影像数据在医疗数据中的占比高达90%且正以每年30%的速度递增&#xff0c;而影像医生就业人数年增长率仅4%。这意味着&#xff0c;全国总人数不到20万的放射科医生&#xff0c;要处理每年75.4亿人次影像相关诊断需求&#xff0c;…

代理模式-P19

静态代理&#xff1a; 创建项目&#xff1a; Rent package com.Li.demo01;//租房 public interface Rent {public void rent(); }Proxy&#xff1a; package com.Li.demo01; //中介&#xff08;负责找房东&#xff09; public class Proxy implements Rent{//private Host h…

Redis安装及使用(WindowsLinux)

Windows 1.下载 下载地址&#xff1a;Releases tporadowski/redis GitHub。 目前最新5.0.14 2.解压 3.先后打开redis-server.exe和redis-cli.exe两个文件&#xff08;一定要按顺序&#xff09; 4.使用 正常使用在redis-cli.exe里面输入各种命令&#xff08;使用期间redis…

7、系统管理

文章目录7、系统管理7.1 Linux 中的进程和服务7.2 service 服务管理&#xff08;CentOS 6 版本-了解&#xff09;7.2.1 基本语法7.2.2 经验技巧7.2.3 案例实操&#xff08;1&#xff09;查看网络服务的状态&#xff08;2&#xff09;停止网络服务&#xff08;3&#xff09;启动…

基于JAVA的个人博客论坛系统的设计与实现参考【数据库设计、源码、开题报告】

在学校开发搭建一个什么项目最有成就感&#xff0c;那肯定就是搭建「个人博客」呀&#xff0c;然后把自己平时的学习笔记写到博客里&#xff0c;这时你的笔记就是**云笔记**&#xff0c;就再也不会出现因为本地文件丢失而感到痛心的事情。 而且&#xff0c;还可以把你的个人博客…

艾美捷小鼠肿瘤坏死因子α-ELISpot试剂盒使用说明

肿瘤坏死因子-α 肿瘤坏死因子-α&#xff08;TNF-α&#xff0c;也称为TNF-α、TNF-a、TNF-a和肿瘤坏死因子α&#xff09;由许多不同的细胞类型产生&#xff0c;例如单核细胞、巨噬细胞、T细胞和B细胞。TNF-α的许多作用包括保护细菌感染、细胞生长调节、免疫系统调节和感染…

Kotlin 使用vararg可变参数

文章目录背景Kotlin中使用可变参数对Kotlin可变参数反编译资料背景 一般在项目开发中&#xff0c;我们经常会在关键节点上埋点&#xff0c;而且埋点中会增加一些额外参数&#xff0c;这些参数通常是成对出现且参数个数是不固定的。如下&#xff1a; //定义事件EVENT_ID const…

云原生|kubernetes |使用Prometheus监控k8s cAdvisor篇(一)(centos)

前言: 为了能够提前发现kubernetes集群的问题以及方便快捷的查询容器的各类参数&#xff0c;比如&#xff0c;某个pod的内存使用异常高企 等等这样的异常状态&#xff08;虽然kubernetes有自动重启或者驱逐等等保护措施&#xff0c;但万一没有配置或者失效了呢&#xff09;&am…

PAM exec模块监控服务器ECS登录用户及IP,触发登录后,发送至钉钉

PAM 模块pam_exec &#xff0c;用于运行外部命令 PAM 项作为环境变量导出&#xff1a;* PAM_RHOST &#xff0c; PAM_RUSER &#xff0c; PAM_SERVICE &#xff0c; PAM_TTY &#xff0c; PAM_USER 和 PAM_TYPE *&#xff0c;其中包含以下模块类型之一&#xff1a;account&…

【深度学习】实验5布置:滴滴出行-交通场景目标检测

DL_class 学堂在线《深度学习》实验课代码报告&#xff08;其中实验1和实验6有配套PPT&#xff09;&#xff0c;授课老师为胡晓林老师。课程链接&#xff1a;https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

电脑c盘分区太小如何可以扩大,电脑c盘不够用了,如何给电脑分区

C盘是很重要的系统盘&#xff0c;会影响到整个系统的正常化运行。如果电脑c盘分区太小如何可以扩大&#xff1f; 一、清理C盘的垃圾文件 C盘分区不足的原因之一就是因为C盘的垃圾文件没有及时清理&#xff0c;导致垃圾文件越来越多&#xff0c;电脑越来越卡&#xff0c;所以&a…

2022最新软件测试面试八股文,全网最全最新,堪称地表最强

前言 2022秋招已经结束&#xff0c;在应聘过程中相信很多同学都感受到了目前测试就业越来越严峻&#xff0c;内卷也成了测试领域的代名词了。的一个HR朋友告诉我&#xff0c;由于门槛较低&#xff0c;现在普通测试岗&#xff08;偏功能&#xff09;的投递比已经将近100&#x…

如何让皮卡丘在网页上跑起来

说在前面 &#x1f388;相信很多80、90后的朋友&#xff0c;对QQ宠物印象非常深刻&#xff0c;每次开机宠物就会自动跑出来。曾经很多人想饿死他&#xff0c;但失败了&#xff1b;也有很多人一上线就退出&#xff0c;但就是不愿因取消“开机自动开启”的勾选。2018年09月15日&a…

Adobe Audition CS6 下载与安装教程

文章目录Adobe Audition CS6 简介&#xff08;一&#xff09;Adobe Audition cs6软件功能&#xff08;二&#xff09;Adobe Audition cs6软件特色&#xff08;三&#xff09;Adobe Audition cs6新增功能一&#xff0c;Adobe Audition CS6 下载二&#xff0c;Adobe Audition CS6…

ReactHook技巧

ReactHook技巧 文章目录ReactHook技巧一 概念二 useState三 useEffect3.1 无需清除副作用(**Effect**)3.2 需要清除副作用(**Effect**)3.3 控制(**Effect**)调用次数一 概念 1.什么是hook? 2.为什么要用hook? -: 为函数组件提供状态管理能力, 扩展 -: 在Function组件中勾入…

常用的国际物流运输方式有哪些

目前我国从事跨境电商行业的人才众多&#xff0c;不仅促进了我国外贸业务的活力&#xff0c;也促进了国际物流业的发展。国际货贸运输涉及陆运物流、海运物流、空运物流、管道物流、多式联运物流、邮运物流等多种运输方式。一、陆运物流 陆运物流含公路和铁路联运物流&#xff…

C语言百日刷题第十天

前言 今天是刷题第10天&#xff0c;放弃不难&#xff0c;但坚持一定很酷~ 快来跟我一起刷题吧。 C语言百日刷题第十天前言81.连接两个字符串82.输入一行字符&#xff0c;分别统计其中英文字母、空格、数字和其他字符的个数。83.写一个排序函数实现数组从小到大的排序84.字母的大…

SPARKSQL3.0-DataFrameAPI与spark.sql()区别源码分析

一、前言&#xff1a; 阅读本节需要先掌握spark-sql内部执行的基本知识&#xff1a; SessionState Unresolved阶段 Analyzer阶段中queryExecution的介绍 二、区别 spark.sql的执行顺序为: sql字符串 -> antlr4解析成AST语法树 -> unreolved解析成logicalPlan ->…

云计算正当时!将你的Java项目容器化

将您的 Java 应用程序 Docker 化 长按关注《Java学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Java学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 随着每个人都转向 Kubernetes&#xff0c;知道如何对应用程序进行 Dockerize 是件好…

IPv6转换难点分析之一:国家监测指标-中科三方

从IPv4过渡到IPv6就像是“打破一个旧世界&#xff0c;创建一个新世界”&#xff0c;注定要经历一个长期的过程&#xff0c;但终究会实现。 一、IPv6过渡转换的障碍 目前互联网上还是以IPv4设备为主&#xff0c;不可能迅速过渡到IPv6&#xff0c;这主要受制于以下几个方面: &…