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

算法题打卡力扣第3题:无重复字符的最长子串(mid)

文章目录

    • 题目描述
    • 解法一:暴力解
    • 解法二:滑动窗口

题目描述

在这里插入图片描述

解法一:暴力解

遍历每一个可能的子串,然后逐一判断每个子串中是否有重复字符。

具体步骤:

  • 使用两层嵌套循环来生成所有子串的起止位置:
    外层循环 i 从 0 到 n-1 (起始位置)。
    内层循环 j 从 i 到 n-1 (结束位置)。
  • 对于每一个子串 s.substring(i, j+1),我们再设计一个辅助函数 hasDuplicate(substring) 来检查这个子串中是否存在重复字符。
  • 检查 hasDuplicate 通常需要使用一个哈希集合 (Set):遍历子串的每个字符,尝试加入 Set。如果某个字符加入失败(因为 Set 中已存在),则说明有重复。
  • 如果没有重复,我们就用 j - i + 1 来更新记录的最大长度 max_len。

实现代码

#include <unordered_set> // 用于哈希集合
#include <algorithm>     // 用于 std::max
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.length();int max_len = 0;for(int i=0;i<n;++i){for(int j=i;j<n;++j){std::string substring = s.substr(i,j-i+1);if(!hasDuplicate(substring)){max_len = std::max(max_len,(int)substring.length());}}}return max_len;}bool hasDuplicate(const std::string&s){std::unordered_set<char> seen_characters;for(char c : s){if(!seen_characters.insert(c).second){return true;}}return false;}
};

执行结果
超出时间范围了
在这里插入图片描述

复杂度分析
时间:O(n^3)
空间:O(n)

解法二:滑动窗口

我们维护一个窗口 [start, end],它始终代表一个不包含重复字符的子串。我们不断尝试扩大这个窗口的右边界end。如果在这个过程中,新加入的字符导致了窗口内出现重复,我们就需要收缩窗口的左边界 start,直到窗口内不再有重复字符为止。

如何快速判断字符是否重复以及其位置?
我们需要一个数据结构来高效地完成两件事:
判断一个字符是否已经在当前窗口中。
如果存在,找出它上次出现的位置。
哈希映射 (Map) 或数组是完美的选择。
哈希映射 Map<Character, Integer>:键 (Key) 存储字符,值 (Value) 存储该字符的最新索引。
数组 int[128]:如果字符集是 ASCII,我们可以用一个大小为 128 的数组来模拟哈希映射,数组的索引是字符的 ASCII 码,值是该字符的最新索引。这比哈希映射更快。

具体步骤 (以哈希映射为例):
初始化两个指针:start = 0 (窗口左边界),end = 0 (窗口右边界)。
初始化 max_len = 0 (记录最大长度)。
初始化一个哈希映射 map,用于存储窗口内字符及其最新索引。
使用 end 指针作为主循环,从 0 遍历到 n-1:
a. 获取当前右边界的字符 char_end = s[end]。
b. 检查 char_end 是否导致重复:
i. 在 map 中查找 char_end。
ii. 如果 char_end 已经在 map 中存在,并且它上次出现的位置 map.get(char_end) 在当前窗口内(即 map.get(char_end) >= start),这说明我们遇到了一个重复字符。
iii. 为了消除这个重复,我们需要将窗口的左边界 start 跳跃到重复字符的下一个位置。即 start = map.get(char_end) + 1。
c. 更新 map:无论是否重复,我们都需要更新 char_end 在 map 中的位置为当前的 end 索引。map.put(char_end, end)。
d. 更新 max_len:在每一步之后,当前有效的无重复子串的长度就是 end - start + 1。我们用它来更新 max_len。 max_len = max(max_len, end - start + 1)。
e. end 指针自增,考察下一个字符。
循环结束后,max_len 就是最终答案。
实现代码


class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.length();if(n==0){return 0;}std::unordered_map<char,int> char_map;int max_len = 0;int start = 0;for(int end = 0;end<n;++end){char current_char = s[end];if(char_map.count(current_char)&&char_map[current_char] >= start){start = char_map[current_char] + 1;}char_map[current_char] = end;max_len = std::max(max_len,end-start+1);}return max_len;}};

执行结果
在这里插入图片描述

复杂度分析
时间:O
空间:O


文章转载自:

http://l9pUzDgt.mjctt.cn
http://wRZdypKO.mjctt.cn
http://ptnrqrLn.mjctt.cn
http://cZHOIYV6.mjctt.cn
http://8R8bMiCE.mjctt.cn
http://j8pNlFpR.mjctt.cn
http://ySfOp7z3.mjctt.cn
http://shSGt242.mjctt.cn
http://LeFjKdYl.mjctt.cn
http://mtgjCdD6.mjctt.cn
http://EXLmWf8P.mjctt.cn
http://gH16PZts.mjctt.cn
http://iPejHijH.mjctt.cn
http://rScwcRVo.mjctt.cn
http://8IZw0VM8.mjctt.cn
http://PHzi75VQ.mjctt.cn
http://3rXXrHMV.mjctt.cn
http://Q18NmzvD.mjctt.cn
http://81EQAymH.mjctt.cn
http://JqXfXirD.mjctt.cn
http://2BtOTZPb.mjctt.cn
http://9W1sKFzZ.mjctt.cn
http://i4kq45Mt.mjctt.cn
http://8aj1VNYw.mjctt.cn
http://7kjdrpPE.mjctt.cn
http://UqryfCXV.mjctt.cn
http://tHjqAN6T.mjctt.cn
http://Kc7Y1Xo4.mjctt.cn
http://dXertdlH.mjctt.cn
http://0naY6QBV.mjctt.cn
http://www.dtcms.com/a/362681.html

相关文章:

  • 在线拍卖|基于Springboot+vue的在线拍卖管理系统(源码+数据库+文档)
  • F5发布后量子API安全解决方案,以AI驱动全面防护应对量子计算威胁
  • 面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用
  • HTML第二课:块级元素
  • 【实时Linux实战系列】采用实时Linux构建无人机控制系统
  • Vue基础知识-Vue中v-cloak、v-text、v-html、v-once、v-pre指令详解
  • 【Doris入门】Doris数据表模型:聚合模型(Aggregate Key Model)详解
  • 数论常见公式定理大全
  • C++学习——继承
  • 无线通信网络是互联网边缘的重要组成,同时也是局域联网的主要方式
  • RT-Thread SMP相关问题分析
  • 01-html css
  • 【论文阅读】Jet-Nemotron: 高效语言模型与后神经网络架构搜索
  • 11.《简单的路由重分布基础知识探秘》
  • 解决完美主义的方法是,去追求不完美--辩证法
  • 《Stable Diffusion XL 1.0 实战:AI 绘画从 “能看” 到 “好看” 的升级技巧》
  • Android把源Bitmap中心缩放到固定宽高的尺寸,Kotlin
  • Kaia AMA 全回顾:如何让 Web3 无痕融入2.5 亿用户日常?9 月 7 日中国行揭秘!
  • WPF启动窗体的三种方式
  • 达梦:存储过程实现多个用户之间表的授权
  • 如何在本地环境中搭建 GitLab 服务器
  • 《IC验证必看|SV中Process控制》
  • ffmpeg 安装
  • 添加⽂件--场景⼆
  • JVM1.8与1.9的区别是什么?
  • 实验2-代理模式和观察者模式设计
  • 实验1-工厂方法和抽象工厂模式
  • C++编程语言:标准库:第37章——正则表达式(Bjarne Stroustrup)
  • 支付系统设计模式应用:从单例到观察者模式实践
  • 普通大学生的 Web3 实习怎么找?行业指南与实践技巧这里看