Leetcode 每日一题 3.无重复字符的最长子串

ops/2024/11/27 22:54:45/

目录

问题描述

输入输出格式

示例

滑动窗口算法步骤

通过图片

代码实现

复杂度分析

题目地址

注意事项


问题描述

给定一个字符串 s,我们需要找出其中不含有重复字符的最长子串的长度。子串是指字符串中连续的字符序列,而子序列则是字符序列,但不必连续。

输入输出格式

  • 输入:一个字符串 s
  • 输出:一个整数,表示最长不含有重复字符的子串的长度。

示例

  1. 输入:s = "abcabcbb",输出:3(最长子串为 "abc")。
  2. 输入:s = "bbbbb",输出:1(最长子串为 "b")。
  3. 输入:s = "pwwkew",输出:3(最长子串为 "wke")。

滑动窗口算法步骤

  1. 初始化:使用一个哈希集合(HashSet)来存储当前窗口内的字符,两个指针 left 和 right 分别表示窗口的左右边界,以及一个变量 maxLen 来记录最长子串的长度。
  2. 扩展窗口:移动 right 指针向右扩展窗口,直到遇到重复的字符。
  3. 处理重复:如果遇到重复字符,移动 left 指针向右,直到窗口内没有重复字符。
  4. 更新最长长度:在每次移动 right 指针后,更新 maxLen,它等于当前窗口的长度,即 right - left + 1
  5. 返回结果:遍历结束后,maxLen 将包含最长不重复子串的长度。

通过图片

代码实现

 

java

import java.util.HashSet;
import java.util.Set;class Solution {public int lengthOfLongestSubstring(String s) {Set<Character> set = new HashSet<>();int maxLen = 0; // 存储最长子串的长度int left = 0; // 左指针for (int right = 0; right < s.length(); right++) {// 如果当前字符已经在窗口中,移动左指针直到窗口内没有重复字符while (set.contains(s.charAt(right))) {set.remove(s.charAt(left));left++;}// 将当前字符加入窗口set.add(s.charAt(right));// 更新最长子串长度maxLen = Math.max(maxLen, right - left + 1);}return maxLen;}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。每个字符最多被访问两次(一次是 right 指针的移动,一次是 left 指针的移动)。
  • 空间复杂度:O(min(m, n)),其中 m 是字符集的大小。在最坏的情况下,我们需要存储所有字符,这取决于字符集的大小。

题目地址

3. 无重复字符的最长子串 - 力扣(LeetCode)

注意事项

  • 确保在移动 left 指针时,从 set 中移除对应的字符。
  • 在每次循环中,都更新最长子串的长度,以确保我们得到全局的最长子串。

现实案例分析:文本编辑器中的自动补全

背景

自动补全功能是现代文本编辑器和IDE的标准配置,它能够根据用户的输入提供单词或代码片段的补全建议。这个功能的核心挑战在于如何快速准确地识别出用户可能想要的补全项,同时确保这些建议是唯一的,避免重复。

问题挑战

在代码补全过程中,一个常见的问题是如何处理用户输入的连续代码片段。例如,当用户输入“system.out.println”时,编辑器需要能够识别出这是一个整体的代码片段,而不是将其拆分为“system.out”和“println”两个独立的部分。

解决方案

利用“无重复字符的最长子串”算法,我们可以有效地识别出用户输入中的最长连续无重复字符序列。这可以帮助我们确定最合适的补全建议,从而提供更准确的自动补全功能。


http://www.ppmy.cn/ops/137198.html

相关文章

HTTP代理是什么,主要用来干嘛?

在探讨互联网通信和数据传输的广阔领域中&#xff0c;HTTP代理作为一个重要而广泛使用的工具&#xff0c;扮演着不可或缺的角色。本文将深入浅出地介绍HTTP代理的基本概念、工作原理及其主要应用场景。 一、HTTP代理的基本概念 HTTP代理&#xff0c;简而言之&#xff0c;是一…

C语言蓝桥杯组题目

系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f;思路 第二题: 一个整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少…

C++:final 关键字用于阻止类被继承或阻止虚函数被进一步重写

final 关键字的作用 C11 引入了 final 关键字&#xff0c;用于阻止类被继承或阻止虚函数被进一步重写。 防止类被继承&#xff1a;在类声明后添加 final&#xff0c;表示该类不能被继承。防止虚函数被重写&#xff1a;在虚函数声明后添加 final&#xff0c;表示该虚函数在派生…

QT-installEventFilter

installEventFilter 是 Qt 框架中的一个方法&#xff0c;用于在对象之间建立事件过滤机制。具体来说&#xff0c;它允许一个对象&#xff08;称为事件过滤器&#xff09;监视另一个对象&#xff08;称为被监视对象&#xff09;的事件&#xff0c;并在这些事件被处理之前对其进行…

C++ STL - vector/list讲解及迭代器失效

vector 使用 vector 是一个动态数组. 构造/拷贝构造/赋值重载函数 int main() {// 是一个模板, 在实例化的时候, 需要指明类型std::vector<int> first; // 一个空的数组std::vector<int> second (4,100); // 设置初始空间大小为 4 个int, 全部初始化为 100std::v…

大语言模型(LLM)的训练微调 Fine Tuning -- part3 本地调用

以下代码示范如何调用已经微调后的大语言模型&#xff0c;调用本地模型 先决条件 已经有了本地训练好的大语言模型&#xff0c;如何训练可以参考我的博文 《生成式 AI》课程 作业6 大语言模型&#xff08;LLM&#xff09;的训练微调 Fine Tuning -- part2-CSDN博客文章浏览阅…

Java异常类——复习1

CSDN 异常类的本质是什么&#xff1f;throwable类做了什么&#xff1f;runtimeexception有什么性质&#xff1f;其余的exception有什么性质&#xff1f;error有什么性质&#xff1f;列举几个必考的java异常子类。讲一下异常捕获的语法。

网络编程第一课

0voice第一课 https://github.com/0voice 今日学习&#xff1a;网络通信IO 网络通信的核心是通过系统提供的socket套接字实现的。socket和c语言中文件操作的本质类似&#xff0c;在c语言中&#xff0c;通过fopen、fclose、fread、fwrite实现了对文件的操作&#xff0c;socket…