做题历程
如果我们不管重复值,用双指针来获取字符串的长度,这一步很简单
public int lengthOfLongestSubstring(String s) {
char[] charArray = s.toCharArray();
int left = -1;
int ans = 0;
for (int right = 0; right < charArray.length; right++) {
ans = Math.max(ans, right - left);
}
return ans;
}
加点东西,加个哈希表来维护一下每个值和对应的索引吧!
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
char[] charArray = s.toCharArray();
int left = -1;
int ans = 0;
for (int right = 0; right < charArray.length; right++) {
Character value = charArray[right];
map.put(value, right);
ans = Math.max(ans, right - left);
}
return ans;
}
如何判断重复值?
用哈希表判断一下?
if (map.containsKey(value)) {
left = map.get(value);
}
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
char[] charArray = s.toCharArray();
int left = -1;
int ans = 0;
for (int right = 0; right < charArray.length; right++) {
Character value = charArray[right];
if (map.containsKey(value)) {
left = map.get(value);
}
map.put(value, right);
ans = Math.max(ans, right - left);
}
return ans;
}
遇到重复值就把左指针的位置更新到上一次出现的位置。这样逻辑上就把字符串左指针左边的字符删除了。但是假如我们再一次碰到重复值,但是取到的位置却是左指针左边的位置怎么办?看起来代码还需要修改一下!
if (map.containsKey(value)) {
int valueIndex = map.get(value);
if (valueIndex > left) {
left = valueIndex;
}
}
取到的重复值的位置大于当前左指针才更新左指针
大功告成
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
char[] charArray = s.toCharArray();
int left = -1;
int ans = 0;
for (int right = 0; right < charArray.length; right++) {
Character value = charArray[right];
if (map.containsKey(value)) {
int valueIndex = map.get(value);
if (valueIndex > left) {
left = valueIndex;
}
}
map.put(value, right);
ans = Math.max(ans, right - left);
}
return ans;
}