数据结构学习 Jz48最长不含重复字符的子字符串

关键词:哈希表 动态规划 滑动窗口

用时:40min 哈希表 动态规划

题解:我觉得这个写的很好。

题目:

方法一:

哈希表 滑动窗口

思路:

我一开始没想到用一个左指针做滑动窗口。

哈希表:存之前出现过的字符最后出现的位置。

左指针l:记录上一个字符所组成的最长不含重复字符的子字符串的左边界。

如果出现了和前面一样的字符,则更新左指针。

注意,如果pre->second+1<l,说明这个重复的数不在我们现在统计的这个区间里面,所以可以直接忽略,所以l=l。

l=std::max(l,pre->second+1);

复杂度计算:

时间复杂度O(n)

空间复杂度O(1)

字符的 ASCII 码范围为 0 ~ 127 ,哈希表最多使用 O(128)=O(1) 大小的额外空间。

代码:

class Solution {
public:int dismantlingAction(std::string arr) {std::unordered_map<char, int> hash;int max = 0;int res=0;if (arr.empty())return max;int l=0;for(int i=0;i<arr.size();++i){auto pre = hash.find(arr[i]);if(pre!=hash.end()){l=std::max(l,pre->second+1);}hash[arr[i]]=i;max=std::max(max,i-l+1);}return max;}
}; 

方法二:

哈希表 动态规划

我一开始想到的是这个方法。

思路:

哈希表:存之前出现过的字符最后出现的位置。

dp状态:

dp[i]以第i个字符为最后一个字符的最长不重复字符串。

转移函数:

1、如果arr[i]没有出现过:

dp[i]=dp[i-1]+1 不重复的字符串又长了

2、如果arr[i]出现过:

这里又分两种情况:

i-pre->second<dp[i-1]+1:

说明上一个重复的字符串,被算进了dp[i-1]区间里面,所以dp[i]=i-pre->second

i-pre->second>=dp[i-1]+1:

说明上一个重复的字符串,没被算进dp[i-1]区间里面,所以dp[i]=dp[i-1]+1

复杂度计算:

时间复杂度O(n)

空间复杂度O(1)

字符的 ASCII 码范围为 0 ~ 127 ,哈希表最多使用 O(128)=O(1) 大小的额外空间。

代码:

class Solution {
public:int dismantlingAction(std::string arr) {std::unordered_map<char, int> hash;int max = 0;int dp = 0;if (arr.empty())return max;for (int i = 0; i < arr.size(); ++i){auto pre = hash.find(arr[i]);if (pre == hash.end()){dp++;max = std::max(max, dp);}else{dp = std::min(i - pre->second, ++dp);max = std::max(max, dp);}hash[arr[i]] = i;}return max;}
}; 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七:Day06_redis高级01

第一章 Redis入门 1.1 节 什么是NoSql型数据库 NoSQL ,泛指非关系型的数据库, NoSQL Not Only SQL,它可以作为关系型数据库的良好补充。NoSQL 不依赖业务逻辑方式存储&#xff0c;而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。 SQLNoSQL数据结构结构化非…

P59 生成式对抗网络GAN-理论介绍 Theory behind GAN

Object Normal Distribution 的数据 经过 Generator 后生成分布更加复杂的PG. 真实数据的分布为 Pdata , 希望 PG和Pdata 越近越好 LOSS 是 两者之间的分布距离 问题: 如何计算 divergence? Sampling is goog enough Discriminator 希望V越大越好 y~Pdata 代表从 Pdata里…

zabbix离线安装 zabbix api批量添加主机

持续更新最新版本… 全自动安装方法 下载一键安装脚本 一键安装脚本执行命令全自动安装 tar -zxvf zabbix-rocky_8_zabbix_6.0.x_mysql.tar.gz cd zabbix-rocky_8_zabbix_6.0.x_mysql sh autosetup.sh installRocky8.9系统下载Rocky系统bug报告 手动安装方法 操作系统&…

Java 语言概述

Java 概述 是 SUN&#xff08;Stanford University Network&#xff0c;斯坦福大学网络公司&#xff09;1995年推出的一门高级编程语言 是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器中运行。这些 Java 程序被称为 Java 小程序&am…

知识付费平台搭建?找明理信息科技,专业且高效

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…

Stable Diffusion模型概述

Stable Diffusion 1. Stable Diffusion能做什么&#xff1f;2. 扩散模型2.1 正向扩散2.2 反向扩散 3. 训练如何进行3.1 反向扩散3.2 Stable Diffusion模型3.3 潜在扩散模型3.4 变分自动编码器3.5 图像分辨率3.6 图像放大 4. 为什么潜在空间是可能的&#xff1f;4.1 在潜在空间中…

HTTP限流控制:Go语言中的精细把关

开场白&#xff1a;在Web应用中&#xff0c;流量控制是一个关键的防护措施&#xff0c;用于防止资源过度消耗和潜在的安全威胁。特别是在面对DDoS攻击或异常请求时&#xff0c;限流显得尤为重要。今天&#xff0c;我们将探讨如何在Go语言中实现HTTP的限流控制。 知识点一&…

【网络技术】【Kali Linux】Wireshark嗅探(五)文件传输协议(FTP)

一、实验目的 本次实验使用Wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解文件传输协议&#xff08;FTP&#xff09;的工作原理。 二、FTP协议概述 文件传输协议&#xff08;File Transfer Protocol&#xff09;是互联网上使用得最广泛的文件传输协议&#xff0c;用…

ArduPilot开源代码之MatekSys Optical Flow 3901-L0X

ArduPilot开源代码之MatekSys Optical Flow 3901-L0X 1. 源由2. 安装3. 参数配置3.1 配置光流定位3.2 配置激光测距3.3 辅助配置 4. 测试4.1 光流数据测试4.2 测距数据测试4.3 室内飞行注意事项4.4 实际飞行测试 5. 参考资料 1. 源由 之前介绍过MatekSys Optical Flow 3901-L0…

Python open函数详解:打开指定文件与 readline和readlines函数:按行读取文件

Python open函数详解&#xff1a;打开指定文件 掌握了各种操作目录字符串或目录的函数之后&#xff0c;接下来可以准备读写文件了。在进行文件读写之前&#xff0c;首先要打开文件。 Python 提供了一个内置的 open() 函数&#xff0c;该函数用于打开指定文件。 open() 函数的…

STM32 学习(三)OLED 调试工具

目录 一、简介 二、使用方法 2.1 接线图 2.2 配置引脚 2.3 编写代码 三、Keil 工具调试 一、简介 在进行单片机开发时&#xff0c;有很多调试方法&#xff0c;如下图&#xff1a; 其中 OLED 就是一种比较好用的调试工具&#xff1a; OLED 硬件电路如下&#xff0c…

魔改Stable Diffusion,开源创新“单目深度估计”模型

单目深度估计一直是计算机视觉领域的难点。仅凭一张 RGB 图像,想要还原出场景的三维结构,在几何结构上非常不确定,必须依赖复杂的场景理解能力。 即便使用更强大的深度学习模型来实现&#xff0c;也面临算力需求高、图像数据注释量大、泛化能力弱等缺点。 为了解决这些难题&a…