3 、leetcode 无重复字符的最长子串
发布日期:2021-05-08 19:30:48 浏览次数:23 分类:精选文章

本文共 1215 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要找到给定字符串中不含有重复字符的最长子串的长度。我们可以使用滑动窗口技术来高效地解决这个问题。

方法思路

我们可以使用滑动窗口技术来解决这个问题。滑动窗口的核心思想是通过两个指针来维护一个窗口,该窗口内的字符都不重复。右指针用于扩展窗口,左指针用于收缩窗口以确保没有重复字符。我们可以使用一个哈希表来记录字符的位置,确保右指针遇到的字符不在当前窗口中。

具体步骤如下:

  • 初始化左指针left和右指针right,以及一个哈希表map来记录字符的位置。
  • 遍历字符串,逐个字符处理:
    • 如果字符已经在哈希表中,且其位置大于等于左指针的位置,则将左指针移动到该字符位置的下一个位置。
    • 更新哈希表,记录当前字符的位置。
    • 计算当前窗口的长度,如果比之前的最大长度大,则更新最大长度。
  • 返回最大长度。
  • 这种方法的时间复杂度是O(n),因为每个字符只被访问一次,哈希表的操作也是O(1)时间。

    解决代码

    import java.util.HashMap;import java.util.Map;public class Solution {    public int lengthOfLongestSubstring(String s) {        int n = s.length();        int max_len = 0;        Map
    charPositions = new HashMap<>(); int left = 0; for (int right = 0; right < n; right++) { char c = s.charAt(right); if (charPositions.containsKey(c)) { left = Math.max(left, charPositions.get(c) + 1); } charPositions.put(c, right); max_len = Math.max(max_len, right - left + 1); } return max_len; }}

    代码解释

    • 初始化变量max_len记录最大长度,charPositions哈希表用于记录字符的位置,left指针初始化为0。
    • 遍历字符串:使用右指针遍历字符串中的每个字符。
    • 检查字符位置:如果字符已经在哈希表中,且其位置大于等于左指针的位置,则更新左指针。
    • 更新字符位置:将当前字符的位置记录到哈希表中。
    • 计算窗口长度:每次更新最大长度。

    这种方法高效且简洁,能够在O(n)时间复杂度内解决问题。

    上一篇:6 只出现一次的数字I II III
    下一篇:按位与、或、非、异或总结

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年03月22日 12时40分41秒