题目分析
假设给定字符串"pwwkew"
字符串中的无重复子串出现位置有如下三种:
第一种情况:‘li’ 到 ‘i-1’ 没有重复字符,那么必然不包含出现过的D的重复字符pi的位置
第二、三种情况:以’i位置’ 的D结尾的子串一定不能包含’pi位置’的D
所以 li 每次找到以i为结尾的子串的最左索引,只需覆盖更新 li
Solutoin
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s == null || s.length() == 0)
return 0;
char[] chars = s.toCharArray();
// 用来保存每一个字符上一次出现的位置
Map<Character, Integer> preIdx = new HashMap<>();
preIdx.put(chars[0], 0);
// 以 i-1位置字符结尾的最长不重复字符串的开始索引(最左索引)
int li = 0;
int max = 1;
for (int i = 1; i < chars.length; i++) {
// i位置字符上一次出现的位置
Integer pi = preIdx.getOrDefault(chars[i], -1);
if (li <= pi) {
li = pi + 1;
}
// 存储这个字符出现的位置
preIdx.put(chars[i], i);
// 求出长度
max = Math.max(max, i - li + 1);
}
return max;
}
}
Reference:小码哥MJ