leetcode:无重复字符的最长字串(详解)

文章目录


一、题目描述?

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

二、题解

方案一:容易理解(时间复杂度O(n))

java 复制代码
   public int lengthOfLongestSubstring(String s) {
        HashMap<Character, Integer> map = new HashMap<>();
        int start=0,max=0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(map.containsKey(c)){
                start=Math.max(start,map.get(c)+1);
            }
            map.put(c,i);
            max=Math.max(max,i-start+1);
        }
        return  max;
    }
  1. HashMap<Character, Integer> map = new HashMap<>();创建一个HashMap,用于存储字符及其最后一次出现的位置。

  2. int max = 0;: 用于记录最长子串的长度。

  3. int start = 0;: 用于记录当前子串的起始位置。

  4. for (int i = 0; i < s.length(); i++) {: 遍历输入字符串。

  5. char ch = s.charAt(i);: 获取当前遍历到的字符。

  6. if (map.containsKey(ch)) { ... }: 如果当前字符已经在子串中出现过。

  7. start = Math.max(map.get(ch) + 1, start);: 更新子串的起始位置,确保不包含重复字符。

  8. max = Math.max(max, i - start + 1);: 计算当前子串的长度并更新最大长度。

  9. map.put(ch, i);: 将字符及其位置放入HashMap。

  10. 最后返回最长子串的长度 max。

方案二:滑动窗口(时间复杂度O(n))

java 复制代码
  public int lengthOfLongestSubstring(String s) {
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        int rk = -1, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }

这段代码使用了滑动窗口的思想。

  1. 初始化一个哈希集合 occ,用于记录每个字符是否出现过。
  2. 定义两个指针 rk 和 i,初始时 rk 为 -1,i 为 0。rk 代表窗口的右边界,i 代表窗口的左边界,初始时窗口大小为 0。
  3. 开始遍历字符串 s 的每个字符:
  • 如果 i 不等于 0,说明窗口已经开始移动了,我们需要将窗口左边界向右移动一格,这时候就需要将原来窗口左边界的字符从哈希集合中移除。
  • 在右边界 rk 小于字符串长度 n 且当前字符 s.charAt(rk + 1) 不在哈希集合中时,循环执行以下操作:
  • 将当前字符 s.charAt(rk + 1) 添加到哈希集合 occ 中。
  • 将右边界 rk 右移一格。
  • 计算当前窗口大小,并更新最长子串长度 ans。
  1. 返回最长子串长度 ans。

相关推荐
沐浴露z20 分钟前
【Java SpringAI智能体开发学习 | 2】SpringAI 实用特性:自定义Advisor,结构化输出,对话记忆持久化,prompt模板,多模态
java·spring·springai
小沈同学呀25 分钟前
创建一个Spring Boot Starter风格的Basic认证SDK
java·spring boot·后端
纪元A梦1 小时前
贪心算法应用:配送路径优化问题详解
算法·贪心算法
码农小伙1 小时前
通俗易懂地讲解JAVA的BIO、NIO、AIO
java·nio
C_player_0011 小时前
——贪心算法——
c++·算法·贪心算法
不要再敲了2 小时前
JDBC从入门到面试:全面掌握Java数据库连接技术
java·数据库·面试
潇I洒2 小时前
若依4.8.1打包war后在Tomcat无法运行,404报错的一个解决方法
java·tomcat·ruoyi·若依·404
kyle~3 小时前
排序---插入排序(Insertion Sort)
c语言·数据结构·c++·算法·排序算法
Funcy3 小时前
XxlJob 源码分析05:执行器注册流程
java
Boop_wu3 小时前
[数据结构] 队列 (Queue)
java·jvm·算法