大家好!我是曾续缘😍
今天是《LeetCode 热题 100》系列
发车第 8 天
滑动窗口第 1 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给定一个字符串
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
由英文字母、数字、符号和空格组成
解题方法
使用哈希表记录每个字符最后出现的位置,维护最长子串的左右端点, 不断地移动右端点, 如果右端点是重复的字符,说明我们新加了一个重复字符,需要减去一个同样的字符,在哪里去减呢? 通过哈希表找到之前重复字符的位置, 左端点改为之前重复字符+1的位置就可以了,相当于减去了一个重复字符. 因为是一个位置一个位置的移动和判断, 因此左右端点之间的子串一定满足无重复字符, 结果取遍历过程中最长的一个就可以了.
Code
查看代码
java
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0)return 0;
HashMap<Character, Integer> mp = new HashMap<Character, Integer>();
int ans = 0, l = 0;
for(int r = 0; r < s.length(); r++){
if(mp.containsKey(s.charAt(r))){
l = Math.max(l, mp.get(s.charAt(r)) + 1);
}
mp.put(s.charAt(r), r);
ans = Math.max(ans, r - l + 1);
}
return ans;
}
}