剑指offer48.最长不含重复字符的子字符串

 我一开始的想法是创建一个大小为26的int数组,下标为0对应的是‘a',25对应的是’z',然后一开始都赋为-1,用一个for循环从头遍历这个字符串,通过char c = s.charAt(i)获得字符,然后c-97,就是它对应的int数组的下标,然后访问这个下标下的元素,如果是-1,那么count++,然后把i赋给这个int数组的这个下标下的元素,如果不是-1,说明前面已经出现过了,然后就把这个下标下的值赋给i,让i从上一次出现的位置的后一个重新开始扫描(这次循环后i会+1所以赋给i的下标上的值而不是下标上的值+1),count归零,数组全部归零,整个期间用max记录count的最大值,最后返回max。

class Solution {int[] visit = new int[26];public int lengthOfLongestSubstring(String s) {renew();int n = s.length();int count=0, max=0;for(int i=0;i<n;i++){char c = s.charAt(i);if(c==32)return 1;if(c<97)continue;int index = c - 97;if(visit[index] == -1){count++;max = Math.max(max, count);visit[index] =i;}else{i = visit[index];count=0;renew();}}return max;     }public void renew(){for(int i = 0;i<26;i++){visit[i] = -1;}}
}

 但是示例里面千奇百怪的字符串,比如这个

 这样遇到第3个b的时候会到!上去,最后还是放弃了,看了题解,题解如下:

class Solution {public int lengthOfLongestSubstring(String s) {HashSet<Character>  occ = new HashSet<Character>();int n = s.length();int rk = -1,ans = 0;for(int i =0;i<n;i++){if(i != 0){occ.remove(s.charAt(i-1));}while(rk + 1 < n && !occ.contains(s.charAt(rk+1))){occ.add(s.charAt(rk+1));rk++;}ans = Math.max(ans, rk - i +1);} return ans;}
}

 题解用的是双指针,左指针先不动,右指针往右移动直到遇见重复的,长度就是右-左,它是用一个HashSet来判断重复,每遍历一个如果set里面没有这个字母,就把这个字母放进set里面,如果有就说明重复了。但是题解中的右指针rk,他并没有拿rk去试探是不是重复,而是拿rk+1去看右指针右边这个是不是重复,所以可以看见字符串的长度不是rk-i而是rk-i+1,并且每次遇到重复rk并不会更新,因为i到rk+1是重复的,说明i+1到rk肯定不是重复的(因为i到rk肯定不是重复的),而且左指针每次移动都要把set里面的上一个左指针的字母删掉,这样可以保证set里面存的都是左指针到右指针之间的字母,没有前面的字母,所以可以看见occ.remove(s.charAt(i-1));发现了重复后进入了下一次循环,所以i要减1,才是删掉了上一个左指针。

还有题解是用动态规划写的:

 动态规划+哈希表:

class Solution {public int lengthOfLongestSubstring(String s) {Map<Character, Integer> dic = new HashMap<>();int res = 0, tmp = 0;for(int j = 0; j < s.length(); j++) {int i = dic.getOrDefault(s.charAt(j), -1); // 获取索引 idic.put(s.charAt(j), j); // 更新哈希表tmp = tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j]res = Math.max(res, tmp); // max(dp[j - 1], dp[j])}return res;}
}

动态规划+线性遍历:

class Solution {public int lengthOfLongestSubstring(String s) {int res = 0, tmp = 0;for(int j = 0; j < s.length(); j++) {int i = j - 1;while(i >= 0 && s.charAt(i) != s.charAt(j)) i--; // 线性查找 itmp = tmp < j - i ? tmp + 1 : j - i; // dp[j - 1] -> dp[j]res = Math.max(res, tmp); // max(dp[j - 1], dp[j])}return res;}
}

双指针+哈希表:

class Solution {public int lengthOfLongestSubstring(String s) {Map<Character, Integer> dic = new HashMap<>();int i = -1, res = 0;for(int j = 0; j < s.length(); j++) {if(dic.containsKey(s.charAt(j)))i = Math.max(i, dic.get(s.charAt(j))); // 更新左指针 idic.put(s.charAt(j), j); // 哈希表记录res = Math.max(res, j - i); // 更新结果}return res;}
}

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

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

相关文章

新抗原预测的计算工作流程

参考文献&#xff1a;Xie N, Shen G, Gao W, Huang Z, Huang C, Fu L. Neoantigens: promising targets for cancer therapy. Signal Transduct Target Ther. 2023 Jan 6;8(1):9. doi: 10.1038/s41392-022-01270-x. PMID: 36604431; PMCID: PMC9816309. 文章目录 *新抗原预测的…

小程序开发趋势:探索人工智能在小程序中的应用

第一章&#xff1a;引言 小程序开发近年来取得了快速的发展&#xff0c;成为了移动应用开发的重要一环。随着人工智能技术的飞速发展&#xff0c;越来越多的企业开始探索如何将人工智能应用于小程序开发中&#xff0c;为用户提供更智能、便捷的服务。本文将带您一起探索人工智能…

uniapp uview文件上传的文件不是文件流,该如何处理?用了uni.chooseImage预览功能要如何做

在使用uniapp开发&#xff0c;运用的ui是用uview&#xff0c;这边需要做一个身份认证&#xff0c;如下图 使用的是uview的u-upload组件&#xff0c;可是这个组件传给后端的不是文件流 后端接口需要的是文件流格式&#xff0c;后面使用了uniapp的选择图片或者拍照的api&#x…

针对高可靠性和高性能优化的1200V硅碳化物沟道MOSFET

目录 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…

Android系统源码 目录结构

前言&#xff1a;Android官方在线看源码地址 https://cs.android.com/ 1.Android系统架构 Android系统架构分为五层&#xff0c;从上到下依次是应用层、应用框架层、系统运行库层、硬件抽象层和Linux内核层。 AOSP 架构 AOSP 的软件堆栈包含以下层&#xff1a; 图 1. AOSP …

MFC、Qt、WPF?该用哪个?

MFC、Qt和WPF都是流行的框架和工具&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;应用程序。选择哪个框架取决于你的具体需求和偏好。MFC&#xff08;Microsoft Foundation Class&#xff09;是微软提供的框架&#xff0c;使用C编写&#xff0c;主要用于Windows…

51单片机学习--蜂鸣器播放音乐

由原理图可知&#xff0c;蜂鸣器BEEP与P1_5 相关&#xff0c;但其实这个原理图有错&#xff0c;实测接的是P2_5 下面这个代码就是以500HZ的频率响500ms的例子 sbit Buzzer P2^5;unsigned char KeyNum; unsigned int i;void main() {while(1){KeyNum Key();if(KeyNum){for(i …

ChatGPT结合知识图谱构建医疗问答应用 (一) - 构建知识图谱

一、ChatGPT结合知识图谱 在本专栏的前面文章中构建 ChatGPT 本地知识库问答应用&#xff0c;都是基于词向量检索 Embedding 嵌入的方式实现的&#xff0c;在传统的问答领域中&#xff0c;一般知识源采用知识图谱来进行构建&#xff0c;但基于知识图谱的问答对于自然语言的处理…

排序进行曲-v2.0

文章目录 小程一言直接插入排序步骤举例复杂度分析应用场景实际举例代码实现 希尔排序步骤举例复杂度分析应用场景实际举例代码实现 堆排序步骤举例复杂度分析应用场景实际举例代码实现 小程一言 这篇文章是在排序进行曲1.0之后的续讲&#xff0c; 由于在上一篇讲的排序的基本…

专家论道: 唐贤香云纱塑造中国非遗国际品牌

自“香云纱染整技艺”入选第二批国家级非物质文化遗产以来&#xff0c;被誉为纺织界“软黄金”的香云纱&#xff0c;重新焕发青春&#xff0c;频频登上时尚舞台&#xff0c;以不一样的面貌展示在世人面前&#xff0c;成为服装设计师、消费者青睐的材质。而随着北京卫视播出的《…

隐私计算互联互通第二批试点项目及标准解读

为进一步促进数据高效流通和数据要素市场高质量发展&#xff0c;推动隐私计算产业健康快速发展。2023隐私计算大会暨首届“星河杯”隐私计算大赛颁奖典礼活动于7月26日在青岛成功举办&#xff0c;吸引了过万人次关注。 DataFountain大数据竞赛平台&#xff08;简称DF平台&…

自动驾驶感知系统--惯性导航定位系统

惯性导航定位 惯性是所有质量体本身的基本属性&#xff0c;所以建立在牛顿定律基础上的惯性导航系统&#xff08;Inertial Navigation System,INS&#xff09;(简称惯导系统)不与外界发生任何光电联系&#xff0c;仅靠系统本身就能对车辆进行连续的三维定位和三维定向。卫星导…

faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

faac内存开销较大&#xff0c;为方便嵌入式设备使用进行优化&#xff0c;在github上提了issues但是没人理我&#xff0c;所以就搞一份代码自己玩吧。 基于faac_1_30版本&#xff0c;原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大&#xff0c;为方便嵌入…

【机器学习】了解 AUC - ROC 曲线

一、说明 在机器学习中&#xff0c;性能测量是一项基本任务。因此&#xff0c;当涉及到分类问题时&#xff0c;我们可以依靠AUC - ROC曲线。当我们需要检查或可视化多类分类问题的性能时&#xff0c;我们使用AUC&#xff08;曲线下面积&#xff09;ROC&#xff08;接收器工作特…

【TypeScript】类型声明及应用(二)

【TypeScript】类型声明及应用&#xff08;二&#xff09; 一、前言 TypeScript开发中需要对定义的变量指定类型&#xff0c;目前版本都支持哪些类型&#xff0c;每一个类型都有哪些含义&#xff0c;在这篇文章中&#xff0c;我们将会对其进行总结说明 二、JavaScript基本数据…

Quartz使用文档,使用Quartz实现动态任务,Spring集成Quartz,Quartz集群部署,Quartz源码分析

文章目录 一、Quartz 基本介绍二、Quartz Java 编程1、文档2、引入依赖3、入门案例4、默认配置文件 三、Quartz 重要组件1、Quartz架构体系2、JobDetail3、Trigger&#xff08;1&#xff09;代码实例&#xff08;2&#xff09;SimpleTrigger&#xff08;3&#xff09;CalendarI…

腾讯云从业者认证考试考点——云网络产品

文章目录 腾讯云网络产品功能网络产品概述负载均衡&#xff08;Cloud Load Balancer&#xff09;私有网络&#xff08;Virtual Private Cloud&#xff0c;VPC&#xff09;专线接入弹性网卡&#xff08;多网卡热插拔服务&#xff09;NAT网关&#xff08;NAT Gateway&#xff09;…

安全文件传输的重要性及其对企业的影响

在当今的信息时代&#xff0c;企业之间的文件传输已经成为日常工作的重要组成部分。无论是在商务合作、人力资源还是财务审计等方面&#xff0c;文件传输都发挥着关键的作用。然而&#xff0c;随着网络技术的发展&#xff0c;网络安全问题也日益突出&#xff0c;泄漏、篡改、丢…

用思维导图带你解读电子商务数据分析基本指标,产品、运营者必看

随着时代的发展&#xff0c;越来越多的人参与到电商之中。电商即电子商务&#xff0c;是依托现代信息网络技术&#xff0c;以商品交换为中心的新型商务贸易活动。电商可并不简单&#xff0c;做好电商又有哪些关键呢&#xff1f;别急&#xff0c;再此之前&#xff0c;需要先了解…

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的&#xff0c;受此启发&#xff0c;Google将其用于图像&#xff0c;并对分类流程作尽量少的修改。 起源&#xff1a;从机器翻译的角度来看&#xff0c;一个句子想要翻译好&#xff0c;必须考虑上下文的信息&…