题意:找到给定字符串中不包含重复字符的字串的最大长度
思路:不包含重复字符--->判断当前游标指向的字符是否在先前的字串中出现,即查找给定字符是否在某个字符串中(哈希表<字符,下标>,时间复杂度O(1),空间复杂度O(n));
使用两个游标分别记录符合条件的字串的左右下标,便于求字串长度, 当被检查的字符在当前的子串中出现过时,当前子串终止继续增长,新字串从当前字符上次出现的下一个位置开始搜索。(哈希表在变化)
注意:任意字符,包括空字符
public int lengthOfLongestSubstring(String s) {
int max = 0;
if(s == null || s.length() == 0){
return max;
}
HashMap
map = new HashMap<>();
int left, right;
left = 0;
map.put(s.charAt(0), left);
max = 1;
for(right = 1; right < s.length(); right++){
if(map.containsKey(s.charAt(right))){
int index = map.get(s.charAt(right));
if(max < (right - left))
max = right - left;
if(index >= left){ //子字串[left, right-1]中查找字符
left = index + 1;
}
}
map.put(s.charAt(right), right); //添加没有的
<字符,位序>
,更新之前相同字符的位序
}
if(max < (right - left)){
max = right - left;
}
return max;
}