写点什么

【LeetCode】无重复字符的最长子串题解

作者:Albert
  • 2022-11-19
    北京
  • 本文字数:885 字

    阅读完需:约 3 分钟

题目描述

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


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

思路分析

  • 今天的算法题目是字符串处理题目,题目要求 找出其中不含有重复字符的 最长连续子字符串 的长度。

  • 首先,不含有重复字符,我们一般可以使用 hashSet 数据结构来进行排重。普通解法的思路是,对字符串进行双重遍历,分别枚举子字符串,然后满足题目要求,计算答案。

  • 在使用普通解法求解题目的时候,发现在遍历的过程中对子字符串有重复计算法的部分。根据重复计算,我们可以进行优化,采用滑动窗口的思想,动态更新不重复的子字符串。我们两个指针变量,分别指向滑动窗口的左右区间。首先固定左区间位置,然后使用 hashset 判断是否包含重复的字符,更新右区间的位置。遇到重复字符,就更新左区间的位置。具体实现代码如下,供参考。

通过代码

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

总结

  • 普通算法的时间复杂度是 O(n * n),空间复杂度是 O(n)。

  • 滑动窗口解法的时间复杂度是 O(n),空间复杂度是 O(1)。

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 3
用户头像

Albert

关注

数据结构和算法爱好者 2019-09-29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】无重复字符的最长子串题解_算法_Albert_InfoQ写作社区