当前位置: 首页 > news >正文

Leetcode刷题记录19——无重复字符的最长子串

题源:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-100-liked

题目描述:
在这里插入图片描述
思路一:
通过两个指针,第一个指针指向字串的开头,第二个指针向后找,直到找到重复的字符或者到达字符的末尾,第二个指针每向后移动一位,当前的子串长度加一,然后与最大长度作比较,留下更大的那个作为最长子串长度。
代码如下:

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""max_len = 0     # 最长子串长度cur_max_len = 0 # 当前找到的最长子串长度cur_set = set()for i in range(len(s)):j = icur_max_len = 0cur_set = set()while j < len(s) and s[j] not in cur_set:cur_set.add(s[j])j += 1cur_max_len += 1max_len = max(max_len, cur_max_len)return max_len

执行时间如下:
在这里插入图片描述
思路二:
思路二其实是对思路一的优化,我们可以看到思路一中这一段代码:

cur_set = set()while j < len(s) and s[j] not in cur_set:cur_set.add(s[j])j += 1cur_max_len += 1max_len = max(max_len, cur_max_len)

当我们找到那个重复的字母时,不需要把右边的指针拉回来重新遍历,因为此时已经可以确定左右指针之间的最长无重复字串长度,无需再进行遍历,更快的做法是向前移动左边的指针,直到找到不重复的字串,将此时的左边指针作为字串开头,移动右边指针继续思路一的遍历即可。
代码实现如下:

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""max_len = 0cur_max_len = 0cur_set = set()left = right = 0while left <= right and right < len(s):if s[right] not in cur_set:cur_set.add(s[right])right += 1cur_max_len += 1max_len = max(max_len, cur_max_len)else:cur_set.discard(s[left])left += 1cur_max_len -= 1return max_len

果然省下了不少时间:
在这里插入图片描述


http://www.mrgr.cn/news/100343.html

相关文章:

  • 揭开人工智能的神秘面纱:从概念到人工神经网络
  • (四) 实战Trae 编译调试C++项目(以minidocx为例)
  • gem5-gpu教程05 内存建模
  • 《USB技术应用与开发》第四讲:实现USB鼠标
  • 树状数组底层逻辑探讨 / 模版代码-P3374-P3368
  • C++指针(三)
  • matplotlib画图工具使用(1) 画折线统计图python代码
  • 海思ISP调试记录
  • Java实现HTML转PDF(deepSeekAi->html->pdf)
  • ubantu中下载编译安装qt5.15.3
  • 使用java代码注册onloyoffice账号 || 注册onloyoffice账号
  • WPF之项目创建
  • Flutter 弹窗队列管理:支持优先级的线程安全通用弹窗队列系统
  • 前端面试之吊打面试官 HTML篇
  • k8s 1.26版部署
  • 网络攻防第一~四集
  • windows下查看idea运行的进程占的JVM情况工具
  • 从后端研发角度出发,使用k8s部署业务系统
  • 在Linux虚拟机下使用vscode,#include无法跳转问题
  • Vue3实现高仿word自定义颜色选择器组件(支持 v-model)