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

【LeetCode】3. 无重复字符的最长子串

题目链接

文章目录


在这里插入图片描述
在这里插入图片描述

Python3

方法:滑动窗口 ⟮ O ( N ) , O ( 1 ) ⟯ \lgroup O(N), O(1)\rgroup O(N),O(1)⟯

在这里插入图片描述

写法一
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        """滑动窗口"""
        ### 处理特殊情况
        if len(s)== 0: return 0

        ## 处理一般情况
        res = 0
        left, right = 0, 0
        while right < len(s):
            if s[right] not in s[left:right]:  # 窗口 右侧 扩展
                res = max(res, right - left + 1)
                right += 1                
            else: ## 因为要是 重复的元素  在窗口中间,left 要一直后移,这时窗口是变小的,在这里更新 maxlen 意义不大,也不会更新
                left += 1

        return res

写法二

写法二: 在 窗口中 定位重复字符位置,直接移动 左侧下标

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        """滑动窗口"""
        ### 处理特殊情况
        if len(s)== 0: return 0

        ## 处理一般情况
        res = 0
        left, right = 0, 0
        while right < len(s):
            if s[right] not in s[left:right]:  # 窗口 右侧 扩展
                res = max(res, right - left + 1)
                right += 1                
            else: 
                left += s[left:right].index(s[right]) + 1   # 注意这里是要加上

        return res

写法三:哈希表 记录 字符 在窗口中的最新位置
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if len(s) == 0:  return 0

        start = -1  # 窗口 左边下标
        dic = {} # 记录 窗口中  每个字符出现的位置
        res = 0

        for i in range(len(s)):
            if s[i] in dic and dic[s[i]] > start: # 窗口 中重复
                start = dic[s[i]]  # 窗口 左侧下标 更新
                dic[s[i]] = i   # 更新该字符 位置
            else: # 未出现重复
                dic[s[i]] = i  # 添加新字符
                res = max(res, i - start) # 更新长度

        return res

C++

方法:滑动窗口 ⟮ O ( N ) , O ( 1 ) ⟯ \lgroup O(N), O(1)\rgroup O(N),O(1)⟯

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char,int> dic;
        int left = -1, res = 0;
        for (int right = 0; right < s.size(); ++right){
            auto it = dic.find(s[right]);
            if (it !=  dic.end()){
                left = max(left, it->second);
            }
            dic[s[right]] = right;
            res = max(res, right - left);
        }
        return res;
    }
};

错误版本:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if (s.size() == 0){
            return 0;
        }

        int left = 0, right = 0, res = 0;
       // unordered_map<char, int> dic; // 字符:窗口中的位置
        while (right < s.size()){
            if (s.substr(left, right-left).find(s[right])){
                res = max(res, right - left + 1);
                ++right;
            }
            else{
                ++left;
            }

        }
        return res;
    }
};
substr(起始下标, 长度)

文档
从字符串起始处的指定位置复制最多某个数目的字符的子字符串。

在这里插入图片描述


http://www.kler.cn/a/108822.html

相关文章:

  • ️️一篇快速上手 AJAX 异步前后端交互
  • 常用的Anaconda Prompt命令行指令
  • 深度学习代码笔记
  • k8s集群安装(kubeadm)
  • Gsensor加速度传感器数据异常及概率性卡死
  • 【学习】【HTML】HTML、XML、XHTML
  • 二叉树的概念
  • 竹云产品入选《2023年度上海市网络安全产业创新攻关成果目录》
  • 【操作系统】进程的控制和通信
  • Pytorch整体工作流程代码详解(新手入门)
  • selenium工作原理和反爬分析
  • JavaWeb 怎么在servlet向页面输出Html元素?
  • Leetcode.274 H 指数
  • Starknet开发工具
  • 解决找不到vcruntime140.dll,无法继续执行代码方法
  • SOLIDWORKS PDM 2024数据管理5大新功能
  • 简单方法搭建个人网站
  • DeOldify 接口化改造 集成 Flask
  • STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据
  • git 推送到github远程仓库细节处理(全网最良心)
  • matlab中narginchk函数用法及其举例
  • FPGA_状态机工作原理
  • 前端小技巧: TS实现new出一个对象的内部过程
  • 独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构
  • maven环境变量,安装源,本地仓库配置
  • STM32F10xx 存储器和总线架构