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;
}
}