0
点赞
收藏
分享

微信扫一扫

leetcode第3题:无重复字符的最长子串

ZGtheGreat 2022-03-23 阅读 61
算法

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

示例:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

算法理解:

暴力解法:
设置一个计数的整型变量,初始化值为0,获取字符串数组第一个位置的值,变量为x,遍历字符串s,获取第一个+1的位置的值,变量为y,那么接下来要判断的是该如何保证这个字符串的不重复性呢,想到不重复,可以采用一个不重复元素特性的集合,set,从x开始遍历,y就是x+1的位置开始遍历,依次加入到set集合中,set存在搜索重复的方法,在每次添加前先搜索一下是否已经含有,如果存在重复就结束遍历,如果不存在重复则继续。在满足这个不重复条件后,其实会有很多次机会出现,因为一段字符串会出现很多段不重复字符串,要找出最长的一段,这时可以采用Math这个工具,找出最大值,而当时长度是x-y+1,这个公式的理解是,比如1、2、3,那3-1是2,在加上本身的1,要注意了这是根据位置算长度。
缺点:比如说,字符串有五个字符,从第1个字符到第5个字符,很荣幸1和2加入了set集合,在到第3个字符的时候发现和第2个字符相同,虽然会结束本次遍历,但是第2到第5个字符遍历的时候,它又会再匹配一次第3个字符是不是和第2个字符重复。

滑动窗口:
建立两个整型变量left、right类似计数器,因为题目是英文字符、数字、符号和空格组成,可以不用hashmap,直接用数组[128]够用了,在初始化的时候left=right=0,从字符串第一个字符开始遍历,获取字符,接着拿这个字符到数组里找(数组【字符】),得到字符在数组的索引,如果不存在则为0,如果存在,left就指向字符索引的位置,再求得最大长度为right-left+1,因为每次循环其实都要作比较,所以left位置和最大长度的值一直都作保留,可以用Math.max(旧值,新值)作比较,然后再下一轮遍历前,将给本轮字符建立数组索引,每次新加入字符,数组索引位置都应该额外+1,包括匹到重复的字符,最后循环直到r=n,终止遍历。

举报

相关推荐

0 条评论