力扣L10--- 3. 无重复字符的最长子串--2024年3月14日

1.题目在这里插入图片描述
2.知识点
注1:containsKey 是 Java 中 HashMap 类的一个方法,用于检查哈希表中是否包含指定的键。

注2:在哈希表(HashMap)中,每个键对应着唯一的值,因此键不能重复但值可以重复
(1)创建哈希表:可以使用 HashMap 类来创建一个哈希表对象。

HashMap<KeyType, ValueType> hashMap = new HashMap<>();

其中,KeyType 是键的类型,ValueType 是值的类型。
(2)添加键值对:可以使用 put() 方法向哈希表中添加键值对。

hashMap.put(key, value);

这会将指定的键和值添加到哈希表中。
(3)获取值:可以使用 get() 方法根据键来获取对应的值。

ValueType value = hashMap.get(key);

这会返回指定键对应的值,如果哈希表中不存在该键,则返回 null。
(4)检查键是否存在:可以使用 containsKey() 方法来检查哈希表中是否包含指定的键。

boolean containsKey = hashMap.containsKey(key);

如果哈希表中包含指定的键,则返回 true;否则返回 false。
(5)删除键值对:可以使用 remove() 方法来删除指定键的键值对。

ValueType removedValue = hashMap.remove(key);

(6)遍历哈希表:可以使用 entrySet() 方法获取哈希表的键值对集合,然后使用循环来遍历这个集合。

for (Map.Entry<KeyType, ValueType> entry : hashMap.entrySet()) {
    KeyType key = entry.getKey();
    ValueType value = entry.getValue();
    // 处理键值对
}

注3:charAt(i) 是 Java 字符串类 String 的一个方法,用于返回字符串中指定索引位置处的字符。

String str = "Hello";
char ch1 = str.charAt(0);  // 获取第一个字符,即 'H'
char ch2 = str.charAt(1);  // 获取第二个字符,即 'e'
char ch3 = str.charAt(4);  // 获取第五个字符,即 'o'

System.out.println(ch1);  // 输出:H
System.out.println(ch2);  // 输出:e
System.out.println(ch3);  // 输出:o

3.思路和例子
用滑动窗口的方法,定义一个左指针和右指针,然后指向字符串的起始位置。
4.代码实现

class Solution {
    public int lengthOfLongestSubstring(String s) {
         //哈希表用来存储每个字符最后出现的位置
        HashMap<Character,Integer> charIndex=new HashMap<>();
        int maxLength=0;
        int start=0;//从起始位置开始的指针
        //i是当前字符的索引的位置
        for(int i=0;i<s.length();i++)
        {
           char c=s.charAt(i);//c是当前索引的字符
         //  if(charIndex.containsKey(c)&&charIndex.getKey(c)>=start)
         //错的原因是hashmap里面的方法只有对象.get(key),这边c就是key,get(key)得到索引值value
            if(charIndex.containsKey(c)&&charIndex.get(c)>=start)
           {
            start=charIndex.get(c)+1;
           }
           charIndex.put(c,i);
           //这行代码将当前字符 c 的最后出现位置更新为当前的索引 i。这样,我们就始终保持了 charIndex 中存储的是每个字符的最后出现位置。
           int currLength=i-start+1;//更新当前的最长长度
        //这行代码计算当前的最长子串的长度。i - start + 1 表示当前字符的索引与起始位置之间的距离加一,即当前子串的长度。这个长度表示的是从起始位置到当前位置的子串长度,这个子串保证不包含重复字符。
         // int changdu=Math.max(maxLength,currLength);
          maxLength=Math.max(maxLength,currLength);
          //I: maxLength 存储的就是字符串中的最长无重复字符子串的长度
          //I:这边再进行比较是因为要符合最长不重复字符....
          //这行代码用于更新 maxLength,确保其存储的是字符串中的最长无重复字符子串的长度。因为我们要找到的是整个字符串中的最长子串,所以需要在每次迭代时更新 maxLength,以保证其存储的是最大的长度值。
          //I:abccab 第一次是ab,第二次也是ab ;
          //在遍历字符串的过程中动态更新最长无重复字符子串的长度,并确保 maxLength 中存储的是最大的长度值。

        }
       return maxLength;

     
    }
}

相关推荐

  1. -3. 重复字符长子

    2024-03-16 22:16:02       44 阅读
  2. 3. 重复字符长子

    2024-03-16 22:16:02       28 阅读
  3. 热题100_滑动窗口_3_重复字符长子

    2024-03-16 22:16:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 22:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 22:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 22:16:02       82 阅读
  4. Python语言-面向对象

    2024-03-16 22:16:02       91 阅读

热门阅读

  1. python中的zip函数

    2024-03-16 22:16:02       41 阅读
  2. 树莓派自动拷贝U盘的视频

    2024-03-16 22:16:02       45 阅读
  3. Python中的QT页面简单开发设计(以计算器为例)

    2024-03-16 22:16:02       45 阅读
  4. Ubuntu快速安装docker

    2024-03-16 22:16:02       44 阅读
  5. 【Unity】详细介绍

    2024-03-16 22:16:02       43 阅读
  6. Linux-网络基础

    2024-03-16 22:16:02       42 阅读
  7. Redis 慢查询是什么?如何配置使用

    2024-03-16 22:16:02       40 阅读
  8. 通过服务器配置cros来解决跨域问题

    2024-03-16 22:16:02       42 阅读
  9. ARTS Week 21

    2024-03-16 22:16:02       42 阅读
  10. 【记录】Git A项目作为产品,B项目继承A项目

    2024-03-16 22:16:02       38 阅读