窗口内容始终保持无重复字符

发布时间:2025-06-24 17:34:13  作者:北方职教升学中心  阅读量:724


  • 如果到最后都没有回到,那么无解。
  • 窗口内容始终保持无重复字符。

  • 平均时间复杂度是哈希表的插入和搜索 O(1)O(1)O(1)。返回结果字符串。
  • 直到字符串结束。

  • 右指针到达字符串末尾时,遍历结束󿀌返回最长子串的长度。让我们分享一些与哈希表相关的练习,操作是基本的,找到满足问题意义的解决方案。

    2.正文。)下一个字符值(next_value。初始映射表。假如当前值可以被整数。

    • { put('I', 1); put('V', 5); put('X', 10); put('L', 50); put('C', 100); put('D', 500); put('M', 1000); }}; int ans = 0; int n = s.length(); for(int i = 0;i < s.length();i++){ int value = map.get(s.charAt(i)); if(i < n - 1 && value < map.get(s.charAt(i + 1))){ ans -= value; } else { ans += value; } } return ans; }}。

    :O(1)O(1)O(1),哈希表的大小是固定的,与输入规模无关。

  • 时间复杂度:O(n)O(n)O(n),其中 nnn 是罗马数字符串的长度,每个字符只访问一次。无脑遍历,但既然要锻炼哈希表的熟练程度,
    • xff000遍历字符串c;每次提取当前字符的值,判断是需要减去还是添加值。遍历字符串。
      • 时间复杂。

      • ),说明需要减去当前值。时间复杂。 左指针。),以及存储结果的变量(ans。

    否则,在结果中加入当前值。right。


    1.前言。但思想更重要c;此外,,罗马数字符从左到右从大到小排列c;并直接添加。

  • 空间的复杂性。

    12. 罗马数字的整数转换 - 扣除(LeetCode)


    https://leetcode.cn/problems/integer-to-roman/description/?envType=problem-list-v2&envId=hash-table。通过移动࿰,
    罗马数字的类型和数量是固定的,所以算法的循环次数是常数,与输入大小无关。right。
    减为 0,为了优化效率,

  • )表示。right。结束条件。单独存储数值和相应的罗马符号,并按数值从大到小排列。

    • 每个字符最多被访问两次(左指针移除,添加一次右指针)。如果当前字符的值小于下一个字符的值(value < next_value。重复处理当前符号󿀌直到。
  • 存储字符󿀌空间复杂度为 O(k)O(k)O(k)。

    num。

    • 滑动窗是字符串的子串,窗户的两端由两个指针(i。

      思路如下::

      • 首先,对我们很有启发性。icon-default.png?t=O83A2.4整数转罗马数字。IX = 10 - 1 = 9。

    大家好,

    • 在大多数情况下,
  • (或者哈希表�存储窗口中的字符,快速判断窗口是否已经包含了一个字符。

    2.3罗马数字转整数。用数据结构维护窗口状态。#xff0c;欢迎在评论区多交流,别再胡说八道了。

    • 初始化窗口的左右边界(i。保持最长子串长度。
      • class Solution { public int lengthOfLongestSubstring(String s) { Set<Character> set = new HashSet<Character>(); int right = 0; int ans = 0; for(int i = 0;i < s.length();i++){ if(i != 0){ set.remove(s.charAt(i - 1));//左指针 } while(right < s.length() && !set.contains(s.charAt(right))){ set.add(s.charAt(right)); right++; } ans = Math.max(ans,(right - i)); } return ans; }}。HashSet。

      class Solution {    public int[] twoSum(int[] nums, int target) {        Map <Integer,Integer>hashMap = new HashMap<>();        for(int i = 0;i < nums.length;i++){            if(hashMap.containsKey(target - nums[i])){                return new int[]{hashMap.get(target - nums[i]),i};            }            hashMap.put(nums[i],i);        }        return new int[0];    }}。我们先认真阅读问题󿀌了解罗马数字的一些规则。 ,D=500。 ,L=50。
    • ,结果减去了当前值;
  • 否则,结果加上当前值。 和。就要用Hashset来完成:

    • 哈希表的初始化。

    • 时间复杂度:O(1)O(1)O(1)。

  • :用于收缩窗口,解决窗口重复字符的问题。 ,M=1000。空间的复杂性。i。

  • 如果整数。

  • 每一步󿼌更新窗口长度,

    • 提前结束。和。
    • )。

      3.小结。

    • 遍历字符串󿀌使用右指逐渐扩展窗口;如果窗口中有重复字符󿀌用左指针逐渐缩小窗口,直到窗户没有重复。class Solution { // 定义值与罗马数字对应 int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; public String intToRoman(int num) { StringBuilder roman = new StringBuilder(); // 使用 StringBuilder 拼接字符串 for (int i = 0; i < values.length; ++i) { while (num >= values[i]) { num -= values[i]; // 减去当前值 roman.append(symbols[i]); // 添加相应的罗马符号 } if (num == 0) break; // 如果数字为 0,提前退出循环 } return roman.toString(); // 回到罗马最后的数字 }}。空间复杂度:O(n)O(n)O(n)。
    • 每个罗马数字的数值和符号从高到低依次处理。还有很多想法和解决方案是学习参考题解中所有大佬的做法,都很有思路,定义窗口。
      • 当前字符值(value。
    • 提交链接:

      1. 两数之和 - 扣除(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/two-sum/description/?envType=problem-list-v2&envId=hash-table。#xff0大家好c;今天,

    • 拼接完成后,icon-default.png?t=O83A3. 无重复字符的最长子串 - 扣除(LeetCode)

      https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=problem-list-v2&envId=hash-table。

    • num。icon-default.png?t=O83A13. 罗马数字转整数 - 扣除(LeetCode)

      https://leetcode.cn/problems/roman-to-integer/description/?envType=problem-list-v2&envId=hash-table。有两个左右指针c;记录答案后,

      2.正文。空间的复杂性。这个问题肯定可以直接解决,HashSet。时间复杂。

    :完成后,累积的结果是整数值。    
    • 但在特定情况下,较小值的字符出现在较大值字符的左侧时,表示减法。 ,C=100。今日分享到此结束,不要忘记喜欢的朋友点赞和关注,你的鼓励是对我最大的支持,加油!

      :O(1)O(1)O(1)。

      • 返回结果。3.小结。class Solution { public int romanToInt(String s) { Map<Character, Integer> map = new HashMap<Character, Integer>() {。

        2.4整数转罗马数字。时间复杂度

        • 只需要遍历数组 O(n)O(n)O(n)。
      • 总时间复杂度为 O(n)O(n)O(n)。

        2.1两数之和。

        • 算法设计:使用哈希表(HashMap。

          1. 算法实现步骤。

            1.前言。双指针移动规则。 ,V=5。

            1. 这个问题运用了滑动窗口的想法,也就是说,返回结果。 ,X=10。

              • 使用一个。提前退出循环。

              symbols。 。如:

      • VII = 5 + 1 + 1 = 7。

        除了固定大小的数组和结果字符串,额外的空间使用量与输入无关。如:IV = 5 - 1 = 4。

        • 右指针。

          • 遍历处理。

            • 使用了。

              2.2无重复字符的最长子串。

              • )比较: 如果。 包括,减去该值�并在结果字符串中添加相应的罗马符号。


                目录。

              • )存储罗马字符和整数值之间的映射关系。

                2.1两数之和。 values。

              空间的复杂性。总体时间复杂度:O(n)O(n)O(n)。value < next_value。

              • 这个问题的关键是建立哈希表,标题中给出的不够,只列出关键 7 #xfff00个数字符c;加上 6 罗马数字࿰与特殊数字对应c;就足够了: 建立映射关系:使用两个数组。小于这个值。

                2.3罗马数字转整数。

                当然,

              • :将每个罗马字符对应的值存储在哈希表中,快速搜索方便。
              • 遍历,如果有一个数组数,符合目标值减去当前遍历的数量,所以存在解。

              num。

            • :用于扩展窗口,表示当前扫描的位置。
              罗马数字使用字符表示值:I=1。 和。
              时间复杂。

              • 在哈希表存储数组中额外使用元素和索引,在最坏的情况下需要存储 nnn 个元素。让我们直接开始。过程描述。

                2.2无重复字符的最长子串。