先导题:https://blog.csdn.net/qq_43606119/article/details/135045019
滑动窗口,其实可以等价成一个队列,代码实现的时候可以直接用两个指针来规范。
判断字符是否已经出现过,用哈希表。
class Solution {
public int lengthOfLongestSubstring(String s) {
int ans = Integer.MIN_VALUE;
char[] chars = s.toCharArray();
HashMap<Character, Integer> h = new HashMap<Character, Integer>();
int l = 0, r = 0;
while (r < s.length()) {
if (h.containsKey(chars[r])) {
int nextL = h.get(chars[r]) + 1;
for (int i = l; i < nextL; i++) {
h.remove(chars[i]);
}
l = nextL;
}
h.put(chars[r], r++);
ans = Math.max(ans, r - l);
}
return ans == Integer.MIN_VALUE ? 0 : ans;
}
}
进一步简化
将哈希表中的元素移除这一步是没有必要的,因为还是要把同样的元素添加进去:
int nextL = h.get(chars[r]) + 1;
for (int i = l; i < nextL; i++) {
h.remove(chars[i]);
}
这里其实我们只是需要记录l
的大小,从而计算长度,所以直接让l
取最大值即可(这是因为如果不取最大值,像abba
这样的字符串,l
的值变化:0-2-1,倒回去了,显然不行):
l = Math.max(l, h.get(chars[r]) + 1);
class Solution {
public int lengthOfLongestSubstring(String s) {
int ans = Integer.MIN_VALUE;
char[] chars = s.toCharArray();
HashMap<Character, Integer> h = new HashMap<Character, Integer>();
int l = 0, r = 0;
while (r < s.length()) {
if (h.containsKey(chars[r])) {
l = Math.max(l, h.get(chars[r]) + 1);
}
h.put(chars[r], r++);
ans = Math.max(ans, r - l);
}
return ans == Integer.MIN_VALUE ? 0 : ans;
}
}
拓展:
首先,需要导入HashMap类,通常是这样做:
import java.util.HashMap;
要创建一个HashMap对象,可以使用以下语法:
HashMap<KeyType, ValueType> map = new HashMap<>();
其中,KeyType
是键的数据类型,ValueType
是值的数据类型。
可以使用put
方法向HashMap中添加键值对:
map.put(key1, value1);
map.put(key2, value2);
// 以此类推
可以使用get
方法通过键来获取对应的值:
ValueType value = map.get(key);
可以使用remove
方法来删除指定键的键值对:
map.remove(key);
可以使用containsKey
方法来检查HashMap中是否包含特定的键:
boolean containsKey = map.containsKey(key);
可以使用不同的方式来遍历HashMap,比如使用keySet
、entrySet
或者迭代器。
keySet
遍历:for (KeyType key : map.keySet()) {
ValueType value = map.get(key);
// 处理键值对
}
entrySet
遍历:for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
KeyType key = entry.getKey();
ValueType value = entry.getValue();
// 处理键值对
}
HashMap还提供了其他一些常用的方法,比如size
用于获取HashMap的大小,clear
用于清空HashMap中的所有键值对等。
以下是一个简单的示例,演示了如何创建HashMap、向其中添加键值对、获取值以及遍历HashMap:
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 3);
map.put("banana", 5);
map.put("orange", 7);
int numberOfApples = map.get("apple");
System.out.println("Number of apples: " + numberOfApples);
for (String fruit : map.keySet()) {
int count = map.get(fruit);
System.out.println("Number of " + fruit + "s: " + count);
}
}
}
String str = "Hello";
char[] charArray = str.toCharArray();
在Java中,Character
和Integer
是类(Class),而char
和int
是基本数据类型(Primitive Data Type)。
char
是Java的一个基本数据类型,用于表示单个字符,采用单引号括起来,例如:'A'
。Character
是Java中用来表示字符的包装类,它提供了一些实用的方法来操作字符。可以使用Character
类来进行字符的大小写转换、判断字符是否是字母或数字等操作。int
是Java的一个基本数据类型,用于表示整数,它没有小数部分,例如:123
。Integer
是Java中用来表示整数的包装类,它提供了许多实用的方法来操作整数。可以使用Integer
类来进行整数的转换、比较大小等操作。以下是一个简单的示例,演示了基本数据类型和其对应的包装类之间的转换:
// 使用基本数据类型
int num1 = 10;
char char1 = 'A';
// 使用包装类
Integer num2 = Integer.valueOf(num1);
Character char2 = Character.valueOf(char1);
在这个示例中,int
和char
是基本数据类型,而Integer
和Character
是对应的包装类。
在Java中,你当然可以使用HashMap
来表示字符到整数的映射关系,但是在实际情况中,使用HashMap
更为常见并且更具有灵活性和可读性。
使用Character而不是char
当你使用HashMap
时,你在存储字符时会使用Character
类的对象而不是基本数据类型char
。这是因为在Java的泛型中,无法直接使用基本数据类型,而需要使用对应的包装类。
使用Character
类可以让你在需要时进行字符的各种操作,比如大小写转换、判断是否为字母等,这提供了更多的灵活性。
使用Integer而不是int
同样地,使用HashMap
允许你使用Integer
对象来表示整数值,这样可以更方便地进行一些操作,比如将整数转换为字符串、进行格式化输出等。