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。

相关推荐
逆风局?11 分钟前
Java基础——分层解耦——IOC和DI入门
java·开发语言
JackieZhang.14 分钟前
求水仙花数,提取算好,打表法。或者暴力解出来。
数据结构·算法
ybq1951334543131 分钟前
javaEE-8.JVM(八股文系列)
java·jvm·java-ee
LUCIAZZZ40 分钟前
Hot100之贪心算法
数据结构·算法·leetcode·贪心算法
h^hh1 小时前
堆的模拟实现(详解)c++
数据结构·c++·算法
飞翔的佩奇1 小时前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的疾病防控综合管理系统(含源码+数据库+毕业论文)
java·数据库·spring boot·mysql·spring·毕业设计·疾病防控
power-辰南1 小时前
技术架构师成长路线(2025版)
java·架构师·学习路线·技术专家
tt5555555555551 小时前
每日一题——小根堆实现堆排序算法
c语言·数据结构·算法·面试·排序算法·八股文
二十雨辰1 小时前
[Java基础]面向对象
java·开发语言
栗豆包2 小时前
w187社区养老服务平台的设计与实现
java·spring boot·后端·spring·tomcat