LeetCode 数据结构与算法之无重复字符的最长子串

简介: LeetCode 数据结构与算法之无重复字符的最长子串

题目


无重复字符的最长子串


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


示例 1:


输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。


示例 2:


输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。


示例 3:


输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。


提示:


0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成


题解


解题分析


解题思路


  1. 这个题目是一个典型的 “滑动时间窗” 算法的题目.


  1. 我们可以用快慢指针的方式来进行字符串的读取,i 表示子串的开始位置,rk 表示子串的当前位置。


我们可以利用 hash 来判断不重复子串。如果 hash 表中存在该字符串,就进入下次循环;如果不存在,就放入集合中然后在再移动右指针。


  1. 最后通过 ans 来保存最大子串长度,然后对比的就是 rk - i + 1 就是右指针- 左指针 + 1


复杂度时间复杂度 O(N)


空间复杂度 O(|Σ|)


解题代码


题解代码如下(代码中有详细的注释说明):


class Solution {
    public int lengthOfLongestSubstring(String s) {
        // hash 集合,记录每个字符串是否出现过
        Set<Character> occ = new HashSet<>();
        int n = s.length();
        // 右指针,初始值为 -1, 相当于我们字符串在左边界的左侧
        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++;
            }
            // 第 i 到 rk 一个字符串是一个,最长的无重复的子串
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }
}


提交后反馈结果(由于该题目没有进行优化,性能一般):


image.png


参考信息



相关文章
|
2月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
53 0
|
2月前
|
存储 算法
Leetcode第三题(无重复字符的最长子串)
这篇文章介绍了解决LeetCode第三题“无重复字符的最长子串”的算法,使用滑动窗口技术来找出给定字符串中最长的不含重复字符的子串,并提供了详细的代码实现和解释。
101 0
Leetcode第三题(无重复字符的最长子串)
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
45 0
|
4月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
4月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
2月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
29 2
|
2月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
96 0
|
2月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
32 0
|
2月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
57 0