leecode题解Golang版本-3-无重复字符最长子串

news2024/11/26 23:31:32

题目

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

题解

func lengthOfLongestSubstring(s string) int {
	m := make(map[uint8]int)
	res := 0
	for l, r := 0, 0; r < len(s); r++ {
		m[s[r]]++
		if v, ok := m[s[r]]; !ok || v == 1 {
			length := r - l + 1
			if length > res {
				res = length
			}
		} else {
			for s[l] != s[r] {
				m[s[l]]--
				l++
			}
			m[s[l]]--
			l++
		}
	}
	return res

}

核心细节一: 使用滑动窗口寻找合适子串

首先我们阐述一下,为什么使用滑动窗口可以去用来求解这类问题。对于这个题目,如果我们使用暴力破解的方式大概应该怎么做?
在这里插入图片描述

以上图为例,我们可以采取如下的解法:
以一号位A为子串的终点,向前探索一个最大不重复子串
以二号位D为子串的终点,向前探索一个最大不重复子串
以三号位O为子串的终点,向前探索一个最大不重复子串

我们可以借用map来统计字符字串是否有相同的元素,这样我们大概可以得出以下解法:

func search(s string, index int) int {
	m := make(map[uint8]int)
	res := 0
	for i := index; i >= 0; i-- {
		if _, ok := m[s[i]]; ok {
			break
		}
		m[s[i]] = 1
		res++
	}
	return res
}

func lengthOfLongestSubstring(s string) int {
	res := 0
	for i := 0; i < len(s); i++ {
		res = max(res, search(s, i))
	}
	return res
}

func max(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

这种解法的算法复杂度是o(n2),读者可以注意到,其实这个解法中做了很多重复性质的工作。我们在每一次切换字符串终点的时候,都在重新往前推进,逐个统计当前字符子串中是否有相同元素。但其实历史元素中的最大不重复字符子串是已经统计过的。如下图所示,我们以A为字符串末尾时,前面一个元素作为字符串末尾的最长不重复字串我们时已经计算过的。

以B为末端最长子串:AODB
使用map统计的结是:
A:1
O:1
D:1
B:1

我们在右端新增一个元素A,会发现统计map变成了

以A为末端最长子串:AODBA
使用map统计的结是:
A:2
O:1
D:1
B:1

为了保证子字符串不含相同元素,我们要将左端收缩到删除重复元素A。
在这里插入图片描述
这么一同分析,题解就简化成了一个滑动窗口的解法。滑动窗口的右端不断增加元素,如果滑动窗口有相同元素,就收缩左端。这种解法的时间复杂度简化到了o(n)。

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

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

相关文章

「Verilog学习笔记」流水线乘法器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule multi_pipe#(parameter size 4 )(input clk , input rst_n ,input [size-1:0] mul_a ,input [size-1:0] mul_b ,output …

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

测试大佬详解:黑盒测试的底层逻辑

什么是黑盒测试&#xff1f; 它是把程序看作一个黑盒子&#xff0c;在不考虑程序内部结构的情况下&#xff0c;检查程序功能是否按照PRD的规定正常使用&#xff0c;程序是否能适当地接收输入数据&#xff0c;产生正确的输出。 这其实就是黑盒测试的定义&#xff0c;也是黑盒测…

Linux---Ubuntu软件安装

1. 软件安装的介绍 Ubuntu软件安装有两种方式: 离线安装(deb文件格式安装&#xff09;在线安装(apt-get方式安装) 2. deb文件格式安装 是 Ubuntu 的安装包格式&#xff0c;可以使用 dpkg 命令进行软件的安装和卸载。 命令说明dpkg安装和卸载deb安装包 dpkg命令选项: 选项…

微服务——服务异步通讯(MQ高级)

MQ的一些常见问题 消息可靠性 生产者消息确认 返回ack&#xff0c;怎么感觉这么像某个tcp的3次握手。 使用资料提供的案例工程. 在图形化界面创建一个simple.queue的队列&#xff0c;虚拟机要和配置文件里面的一样。 SpringAMQP实现生产者确认 AMQP里面支持多种生产者确认的类…

数据库sql语句查询补充

数据库sql语句查询补充 0.前言1.Like谓语2.带有Having当中的分组查询eg. 例题:错题重做: 3.内连接例题 0.前言 数据库期末复习,对自己做错的题进行知识总结和梳理 1.Like谓语 like谓语主要有两个操作 %:百分号,表示任意长度的字符串_:下划线,表示任意单个字符 like谓语的语…

MySQL数据库,触发器、窗口函数、公用表表达式

触发器 触发器是由事件来触发某个操作&#xff08;也包含INSERT、UPDATE、DELECT事件&#xff09;&#xff0c;如果定义了触发程序&#xff0c;当数据库执行这些语句时&#xff0c;就相当于事件发生了&#xff0c;就会自动激发触发器执行相应的操作。 当对数据表中的数据执行…

AX7A200教程(9): ov5640摄像头输出显示720p视频

一&#xff0c;功能框图 ov5640摄像头视频通过ddr3缓存后&#xff0c;最后使用hdmi接口进行输出显示 二&#xff0c;摄像头硬件说明 2.1&#xff0c;像头硬件管脚 如下图所示&#xff0c;一共18个管脚 2.2&#xff0c;摄像头电源初始化时序 因这个ov5640摄像头是买的老摄像…

“去 Android化”为何蔚然成风?

早在2008年时&#xff0c;国内市场诞生了第一批自研手机OS&#xff0c;由于种种缘由铩羽而归&#xff0c;“优化Android ”貌似成为了本土特色。而从2023年下半年开始掀起了一股"去安卓化"的热潮&#xff0c;像华为、小米、vivo等都不约而同的站在了同一战线。 “去…

Kotlin Multiplatform的现状—2023年网络研讨会

Kotlin Multiplatform的现状—2023年网络研讨会 在2023年&#xff0c;Kotlin Multiplatform因其开发、当前状态和未来潜力而受到了相当大的关注。随着越来越多的开发者对采用KMP进行跨平台解决方案表示兴趣&#xff0c;JetBrains在11月下旬推出了一系列网络研讨会作为回应。首…

数字化转型三大证书推荐:TOGAF+ITIL4+DAMA

&#x1f308;数字化转型是企业发展的必经之路。通过数字化的手段&#xff0c;有效提升企业业务开展及内部运营的效率&#xff0c;利于企业的降本增效及流程再造。 目前关于数字化转型的培训学习越来越多&#xff0c;对于推动企业数字化转型起到了重要作用。 数字化转型三大证书…

css+html横向滚动+固定宽

没什么好说的&#xff0c;快上代码&#xff01; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Do…

滴灌广袤农村——建行江门市分行多维施策惠乡村

江门是全省农业大市、海洋大市&#xff0c;县域面积辽阔&#xff0c;约占全市95%&#xff0c;总人口和GDP约占7成左右&#xff0c;为建行江门市分行服务乡村振兴提供“沃土”。建行江门市分行以新金融行动贯彻新发展理念&#xff0c;主动作为&#xff0c;以数字技术赋能乡村振兴…

竞赛保研 python的搜索引擎系统设计与实现

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

域名接入CloudFlare

接入Cloudflare分为两步 Cloudflare中注册站点域名DNS修改 整个过程如下 1.) 访问Cloudflare面板&#xff0c;添加站点 2.) 选择免费版 3.) 查看并明确DNS记录&#xff0c;其中服务的解析地址填写自己实际的服务器ip 4.) 去域名管理控制台&#xff0c;移除旧DNS服务器&#…

Spring Cloud:Eureka

目录 一、Eureka介绍 1.Eureka的作用 2.总结 二.搭建Eureka服务端步骤 1.导入maven依赖 2.编写启动类&#xff0c;添加EnableEurekaServer注解 3.添加application.yml文件&#xff0c;编写下面的配置&#xff1a; 三.注册Eureka客户端服务提供者&#xff08;user-servic…

从 0 开始创建 SpringBoot 项目

从 0 开始创建 SpringBoot 项目 从 0 开始创建 SpringBoot 项目环境准备创建项目项目目录结构及说明编写代码参考 从 0 开始创建 SpringBoot 项目 环境准备 操作系统&#xff1a;Windows 10IDE&#xff1a;IntelliJ IDEA 2023.3.1Java 版本&#xff1a;jdk1.8 工具网盘链接&…

Maven下载及安装自用版

Maven下载及安装自用版 可能是Maven用久了。感觉Maven用起来还算顺手&#xff0c;比Gradle要好上手一些。 一、下载 Maven 下载地址 注意下载版本和依赖要求&#xff0c;下载后&#xff0c;解压放在指定的位置;注意安装地址&#xff0c;放在自己规划好的开发环境专用文件夹里…

三菱plc学习入门(一,认识三菱plc)

今天就开始对三菱的plc软件入一个门&#xff0c;希望小编的文章对读者和初学者有所帮助&#xff01;欢迎评论指正&#xff0c;废话不多说&#xff0c;下面开始学习。 目录 plc的型号介绍 M表示什么&#xff1f; T表示什么&#xff1f; R表示什么&#xff1f; 为什么三菱没…

创建自定义 gym env 教程

gym-0.26.1 pygame-2.1.2 自定义环境 GridWolrdEnv 教程参考 官网自定义环境 &#xff0c;我把一些可能有疑惑的地方讲解下。 首先整体文件结构, 这里省略了wrappers gym-examples/main.py # 这个是测试自定义的环境setup.py gym_examples/__init__.pyenvs/__init__.pygri…