力扣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;

     
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值