LeetCode 热题 HOT 100 第3天: “无重复字符的最长子串”

继续刷LeetCode 热题 HOT 100 的题目,并且在博客更新我的solutions。在csdn博客中我会尽量用文字解释清楚,相关Java代码大家可以前往我的个人博客jinhuaiyu.com中查看。
最近还有点别的事情,每天只刷了一道题,后面速度加快后也要增加每天的刷题量。
时间:2022.1.6
题目:无重复字符的最长子串
给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是子串的长度,“pwke” 是一个子序列,不是子串。
示例 4:
输入: s = “”
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
solution 1:
这题的暴力破解我就不讲了,首先我想到用递归和动态规划去实现,因为以第i个字符结尾的最长不重复子串长度L(i)和以第i-1个字符结尾的最长不重复子串长度L(i-1)有关。如果s.charAt(i)没在前面出现过,那么L(i)=L(i-1)+1。如果s.charAt(i)出现过,又根据上一次出现到这次的距离d分为两种情况:第一种:d<=L(i-1),此时L(i)=d;第二种:d>L(i-1),此时L(i)=L(i-1)+1。需要注意的是每次递归后回溯时会修改两个变量,一个是全局最大长度,一个是当前L(i),用于在回溯时给L(i+1)计算使用。
solution 2:
这种方法是大多数人给出的解法,也非常好理解,就是对暴力法的两层循环进行处理,变成O(m+n)时间复杂度,这种方法叫滑动窗口法。设置左右两个指针(包裹的字符串就是滑动窗口),刚开始都在最左侧,每次循环时,右指针尽可能像右移动来使窗口成为最长不重复字符串。注意,这里我们要使用集合这种数据结构,集合是不可重复的,右指针每次成功移动时也把新的不重复字符放入集合中。当右指针找到一个在集合中存在的重复字符时,左指针就得开始向右移动并把指向的字符从集合中移除,直到移除了右指针指向的重复字符,此时左指针停下来了,右指针又可以尽可能向右移动。重复上面的左右指针移动过程,保证滑动窗口中的字符串一直是以当前左指针为起始的最长不重复子串。直到指针移到原字符串最后,此时前面找到的所有窗口中最长的就是我们要求的,可以用一个变量在每次移动时记录最长长度。

Finally,代码放在我的个人博客http://jinhuaiyu.com/leetcode-longest-substring-without-repeating-characters/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值