49.最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
假设字符串中只包含从 a 到 z 的字符。
数据范围:
输入字符串长度 [0,1000]。
样例:
输入:"abcabc"
输出:3
代码:
class Solution {
public int longestSubstringWithoutDuplication(String s) {
//使用哈希表记录当前窗口各字符的出现次数
Map<Character,Integer>mp = new HashMap<>();
//记录最长无重复字符子串的长度
int res = 0;
//滑动窗口:i为窗口右边界,j为窗口左边界
for(int i = 0,j = 0;i<s.length();i++){
char c = s.charAt(i);
//更新当前字符计数(如果不存在则默认为0+1)
mp.put(c,mp.getOrDefault(c,0)+1);
//如果当前字符计数>1,说明出现重复
//需要移动左边界j,直到去除重复字符
while(mp.get(c)>1){
char c1 = s.charAt(j);
//左边界字符的计数减1
mp.put(c1,mp.getOrDefault(c1,0)-1);
//左边界右移
j++;
}
//更新最大长度(当前窗口长度i-j+1)
res = Math.max(res,i-j+1);
}
//返回最终结果
return res;
}
}

浙公网安备 33010602011771号