8.无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例1:
输入:s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例3:
输入:s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
- 0 <= s.length <= 5 * 104
- s 由英文字母、数字、符号和空格组成
代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
//mp用来存储子串
Map<Character,Integer>mp = new HashMap<>();
//res表示不含重复字符的最长字串的长度
int res = 0;
//循环遍历字符串s
for(int i=0,j=0;i<s.length();i++){
//c用于记录子串最右端子串
char c = s.charAt(i);
//将c存入map,如果map中不存在c,则c的个数记为1,否则c的个数+1
mp.put(c,mp.getOrDefault(c,0)+1);
//判断map中c的个数是否大于1,如果大于1,表示当前记录的子串中出现了重复的c
while(mp.get(c)>1){
//c1用于记录子串最左端字符
char c1 = s.charAt(j);
//将j向右移,同时将s[j]代表的字符的个数-1,直到c的个数小于等于1为止,即不出现重复的c为止(题目要求不重复字符)
mp.put(c1,mp.getOrDefault(c1,0)-1);
j++;
}
//更新不含重复字符的最长字串的长度
res = Math.max(res,i-j+1);
}
//返回不含重复字符的最长字串的长度
return res;
}
}

浙公网安备 33010602011771号