请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
s.length <= 40000
题解:
class Solution {
public int lengthOfLongestSubstring(String s) {
// 滑动窗口
int p = 0;
int q = 0;
int maxLen = 0; // 最大长度
Set<Character> set = new HashSet<>(); // 保存当前窗口中的字符
// 右指针
while (q < s.length()) {
char c = s.charAt(q);
if (!set.contains(c)) { // 如果不包含,q++,maxLen = q-p
set.add(c);
q++;
if ((q-p) > maxLen) {
maxLen = q-p;
}
continue;
}
// 如果包含,那么移动p指针到重复的位置
if (set.contains(c)) {
while (set.contains(c)) {
set.remove(s.charAt(p));
p++;
}
}
}
return maxLen;
}
}
此博客介绍了如何使用滑动窗口算法来寻找字符串中最长的不包含重复字符的子字符串。通过移动左右指针并利用HashSet存储当前窗口内的字符,可以有效地计算出最大长度。示例包括了不同情况的处理,如输入字符串abcabcbb、bbbbb和pwwkew,展示了算法在各种场景下的应用。
564

被折叠的 条评论
为什么被折叠?



