给定一个字符串 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;//循环遍历字符串sfor(int i=0,j=0;i<s.length();i++){//c用于记录子串最右端子串char c = s.charAt(i);//将c存入map,如果map中不存在c,则c的个数记为1,否则c的个数+1mp.put(c,mp.getOrDefault(c,0)+1);//判断map中c的个数是否大于1,如果大于1,表示当前记录的子串中出现了重复的cwhile(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;}
}