题目描述
给定一个字符串 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 由英文字母、数字、符号和空格组成
题目解析
典型的滑动窗口题目 需要注意要求最长子串的长度 那么应该在控制窗口内没有重复子串的时候计算结果
show code
class Solution {
public int lengthOfLongestSubstring(String s) {
// s 字符串的长度
int n = s.length();
// 定义 子串的左边界
int left = 0;
// 定义一个结果变量.
int ans = 0;
// 定义一个map来记录字符出现的次数.
Map<Character, Integer> cntMap = new HashMap<>();
for(int right = 0;right < n;right++) {
char at = s.charAt(right);
// 记录当前字符出现的次数.
cntMap.put(at, cntMap.getOrDefault(at, 0 ) + 1);
while(cntMap.get(at) > 1) {
char l = s.charAt(left);
cntMap.put(l, cntMap.get(l) - 1);
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}
标签:子串,字符,leet,code,int,right,cntMap,最长
From: https://blog.51cto.com/u_16079703/7739700