每日一题:LeetCode-LCR 016. 无重复字符的最长子串

每日一题系列(day 15)

前言:

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

   🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️


题目:

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

示例:

在这里插入图片描述

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

解法一:

  思路:

  这道题目让我们求出最长子串的长度,我们先来使用暴力来解决这道题目,要判断是否有重复字符的最长子串我们首先会想到用双指针来解决。
  1、设置左右指针,让右指针前进,将右指针遍历过得元素用哈希表记录,当右指针指向的元素在哈希表里出现了两次,则右指针停止前进。
  2、这时记录出本次无重复子串的长度,然后左指针向后移动一位,右指针回退到左指针位置,再将哈希表清空,重新开始记录。
  3、这样不断枚举出所有不重复子串,最后就能得到最长子串,这里需要注意的是,右指针长度不能超过数组s的长度。

  代码实现:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = { 0 };//用数组模拟哈希表
        int len = s.size();//求出字符串s的长度
        if(len == 1) return 1;
        
        int ret = 0, right = 0, left = 0;//设置左右指针以及ret记录最长子串
        while(left < len)//左指针在数组范围内
        {
            again://防止右指针多加一次
            hash[s[right]]++;//将右指针的值在哈希表中对应位置++

            while(hash[s[right]] > 1)//表示右指针遇到了重复值
            {
                left++;//遇到重复值本次结束将左指针向右移动一位开启下一轮比较
                ret = max(ret, right - left + 1);//记录下本次无重复子串长度
                right = left;//右指针回退到左指针位置
                memset(hash, 0, sizeof(hash));//将hash表重置
                goto again;//防止right多加一次
            }
            if(right != len)//保证右指针不越界
            right++;
        }
        
        return ret;//返回最长子串即可
    }
};

在这里插入图片描述
  这样的暴力似乎还不错,但是有没有更好的写法了呢?其实是有的,在我们的暴力的基础上进行优化。


解法二:

  思路:

  如果你理解透了暴力解法,那么就可以在此基础上进行进阶—— 滑动窗口 问题:

  1、其实我们在使用右指针时,回退那一步操作完全没有必要进行,因为回退之后再次向后遍历,遍历到的新的重复字符一定是要比上一次右指针最远位置相等或者更远的,因为遇到了两个相等的字符,我们右指针就会停下,那么右指针前面扫描过的区域就一定不会存在重复字符问题,所以我们并不需要回退这部操作
  2、既然不需要回退这步操作,那么我们哈希表也不用每次使用都要清零再记录了,当左指针移动之前,我们就将左指针对应位置的哈希值-1,这样就能继续保证左右指针区间内无重复字符了。
  3、第二步操作有些问题,当数组为大量重复数据时,如果仅仅判断一次,那么就会造成长度误判,所以只要我们右指针指向元素的哈希值>1,那么我们就一直执行第二步操作
  3、左指针移动之后,我们就与上一次记录的不重复子串进行比较,返回较大值。这些做完之后,开始新一轮查询,右指针自增。当右指针遍历完整个数组后,最长子串也就出来了。

在这里插入图片描述

  代码实现:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int hash[128] = { 0 };//数组代替哈希表
        int left = 0, right = 0, n = s.size();
        int ret = 0;//返回值
        while(right < n)
        {
            hash[s[right]]++;
            while(hash[s[right]] > 1)//防止重复数据
            {
                hash[s[left++]]--;
            }
            ret = max(ret, right - left + 1);
            right++;
        }
    return ret;
    }
};

在这里插入图片描述


  这题使用双指针暴力写法也不是很简单,尤其是在右指针回退那里,一不小心就容易出错,而我们使用滑动窗口来解决问题,虽然代码量很少,但是却很不好想,滑动双指针的题做多了可能你觉得滑动双指针不难,可是我认为,我们能想到这题使用滑动双指针更加重要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32_串口下载程序

目录标题 前言1、理论知识2、串口下载具体操作2.1、硬件准备2.2、软件准备2.3、设置单片机的启动模式为系统存储器启动2.4、软件配置2.5、下载程序 附:生成hex文件 前言 使用调试器下载程序又快有稳定还能使用调试功能&#xff0c;当然是下载调试的首选。但是拓展下串口下载程…

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;通常指函数或者类&#xff0c;一般是开发完成的。 单元…

【论文阅读笔记】Pre-trained Universal Medical Image Transformer

Luo L, Chen X, Tang B, et al. Pre-trained Universal Medical Image Transformer[J]. arXiv preprint arXiv:2312.07630, 2023.【代码开源】 【论文概述】 本文介绍了一种名为“预训练通用医学图像变换器&#xff08;Pre-trained Universal Medical Image Transformer&…

浅谈深度学习中的不同归一化层

引言 目前&#xff0c;深度学习已经彻底改变了自然语言处理、计算机视觉、机器人等许多子领域。深度学习当然涉及训练精心设计的深度神经网络&#xff0c;并且各种设计决策会影响这些深度网络的训练机制。其中一些设计决策包括 网络中要使用的网络层类型&#xff0c;例如卷积…

AudioGPT 语音技术全覆盖:语音识别、增强、分离、风格迁移等 | 开源日报 No.114

stevearc/oil.nvim Stars: 1.7k License: MIT oil.nvim 是一个类似于 vim-vinegar 的文件浏览器&#xff0c;允许您像普通 Neovim 缓冲区一样编辑文件系统。其主要功能包括支持常见插件管理器、通过适配器抽象进行所有文件系统交互以及提供 API 来执行各种操作。该项目的关键…

LLM之RAG实战(五)| 高级RAG 01:使用小块检索,小块所属的大块喂给LLM,可以提高RAG性能

RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;系统从给定的知识库中检索相关信息&#xff0c;从而使其能够生成事实信息、上下文相关信息和特定领域的信息。然而&#xff0c;在有效检索相关信息和生成高质量响应方面&#xff0c;RAG面临…

redis:六、数据过期删除策略(惰性删除、定期删除)和基于redisson实现的分布式锁(看门狗机制、主从一致性)和面试模板

数据过期删除策略 Redis的过期删除策略&#xff1a;惰性删除 定期删除两种策略进行配合使用 惰性删除 惰性删除&#xff1a;设置该key过期时间后&#xff0c;我们不去管它&#xff0c;当需要该key时&#xff0c;我们在检查其是否过期&#xff0c;如果过期&#xff0c;我们就…

119. 杨辉三角 II

描述 : 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和 题目 : LeetCode 119. 杨辉三角 II : 119. 杨辉三角 II 分析 : 这道题用二维数组来做 . 解析 : class Solution {pub…

Jmeter接口测试断言

一、响应断言 对服务器的响应接口进行断言校验&#xff0c;来判断接口测试得到的接口返回值是否正确。 二、添加断言 1、apply to&#xff1a; 通常发出一个请求只触发一个请求&#xff0c;所以勾选“main sampie only”就可以&#xff1b;若发一个请求可以触发多个服务器请…

选择排序、快速排序和插入排序

1. 选择排序 xuanze_sort.c #include<stdio.h> #include<stdlib.h>//选择排序void xuanze_sort(int arr[],int sz){//正着for(int i0;i<sz;i){//外层循环从第一个数据开始依次作为基准数据for(int j i1;j<sz;j){//int j i1 因为第一个数据作为了基准数据&…

如何使用 C++ 开发 Redis 模块

在本文中&#xff0c;我将总结 Tair 在使用 C 开发 Redis 模块时遇到的一些问题&#xff0c;并将其提炼为最佳实践。目的是为 Redis 模块的用户和开发人员提供帮助。其中一些最佳实践也可以应用于 C 编程语言和其他编程语言。 介绍 从 Redis 5.0 开始&#xff0c;支持模块插件…

Unity中URP下的顶点偏移

文章目录 前言一、实现思路二、实现URP下的顶点偏移1、在顶点着色器中使用正弦函数&#xff0c;实现左右摇摆的效果2、在正弦函数的传入参数中&#xff0c;加入一个扰度值&#xff0c;实现不规则的顶点偏移3、修改正弦函数的振幅 A&#xff0c;让我们的偏移程度合适4、修改正弦…

【玩转 TableAgent 数据智能分析】股票交易数据分析+预测

文章目录 一、什么是TableAgent二、TableAgent 的特点三、实践前言四、实践准备4.1 打开官网4.2 注册账号4.3 界面介绍4.4 数据准备 五、确认分析需求六、TableAgent体验七、分析结果解读八、总结&展望 一、什么是TableAgent TableAgent是一款面向企业用户的智能数据分析工…

Redis——多级缓存

JVM进程缓存 为了演示多级缓存&#xff0c;这里先导入一个商品管理的案例&#xff0c;其中包含商品的CRUD功能。将来会给查询商品添加多级缓存。 导入Demo数据 1.安装mysql 后期做数据同步需要用到MySQL的主从功能&#xff0c;所以需要在虚拟机中&#xff0c;利用Docker来运…

C++ Qt 开发:ListWidget列表框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍ListWidget列表框组件的常用方法及灵活运用。…

【网络安全】-Linux操作系统基础

文章目录 Linux操作系统目录结构Linux命令格式Linux文件和目录操作命令Linux用户和用户组操作命令Linux查看和操作文件内容命令Linux文件压缩和解压缩命令Linux网络管理命令Linux磁盘管理和系统状态命令Linux安全加固总结 Linux是一个强大的操作系统&#xff0c;广泛用于服务器…

C# WPF上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 软件上面如果一个操作比较缓慢&#xff0c;或者说需要很长的时间&#xff0c;那么这个时候最好添加一个进度条&#xff0c;提示一下当前任务的进展…

通过层进行高效学习:探索深度神经网络中的层次稀疏表示

一、介绍 深度学习中的层次稀疏表示是人工智能领域日益重要的研究领域。本文将探讨分层稀疏表示的概念、它们在深度学习中的意义、应用、挑战和未来方向。 最大限度地提高人工智能的效率和性能&#xff1a;深度学习系统中分层稀疏表示的力量。 二、理解层次稀疏表示 分层稀疏表…

【MATLAB】数据拟合第11期-基于粒子群迭代的拟合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于粒子群迭代的拟合算法是一种优化技术&#xff0c;它基于粒子群优化算法&#xff08;PSO&#xff09;的基本思想。该算法通过群体中个体之间的协作和信息共享来寻找最优解。 在基于粒…

探索拉普拉斯算子:计算机视觉中用于边缘检测和图像分析的关键工具

一、介绍 拉普拉斯算子是 n 维欧几里得空间中的二阶微分算子&#xff0c;表示为 ∇。它是函数梯度的发散度。在图像处理的上下文中&#xff0c;该运算符应用于图像的强度函数&#xff0c;可以将其视为每个像素具有强度值的二维信号。拉普拉斯算子是计算机视觉领域的关键工具&am…