一、题目描述
给定一个字符串 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、Java
class Solution {
public int lengthOfLongestSubstring(String s) {
// 创建散列表,用来装不重复的子串
Set<Object> sub = new HashSet<>();
// 设置右指针初始值
int right = -1;
// 用来记录最长子串的大小
int maxSub = 0;
// 遍历字符串,i 为子串起始索引
for(int i = 0; i < s.length(); i++){
if(i != 0){
// 移除子串从 i - 1 开始的字符,让子串从 i 开始
sub.remove(s.charAt(i -1));
}
// 从字符串 s 第一个字符开始遍历,添加不重复的字符
while(right + 1 < s.length() && !sub.contains(s.charAt(right + 1))){
// 添加到散列表中
sub.add(s.charAt(right + 1));
// 指针向右移动
right++;
}
// right - i + 1 为当前循环结束子串的长度, 获取最大值
maxSub = Math.max(maxSub, right - i +1);
}
// 返回结果
return maxSub;
}
}
2、Python
class Solution(object):
def lengthOfLongestSubstring(self, s):
# 创建哈希集合,用来装不重复的子串
sub = set()
# 设置右指针初始值
right = -1
# 用来记录最长子串的大小
maxSub = 0
# 遍历字符串,i 为子串起始索引
for i in range(len(s)):
if i != 0:
# 移除子串从 i - 1 开始的字符,让子串从 i 开始
sub.remove(s[i - 1])
# 从字符串 s 第一个字符开始遍历,添加不重复的字符
while right + 1 < len(s) and s[right + 1] not in sub:
# 添加到哈希集合中
sub.add(s[right + 1])
# 指针向右移动
right += 1
# right - i + 1 为当前循环结束子串的长度, 获取最大值
maxSub = max(maxSub, right - i +1)
# 返回结果
return maxSub