LeetCode刷题之算法
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
解题如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int res = 0;
int end = 0, start = 0;
Set<Character> set = new HashSet<>();
while (start < n && end < n) {
if (set.contains(s.charAt(end))) {
set.remove(s.charAt(start++));
} else {
set.add(s.charAt(end++));
res = Math.max(res, end - start);
}
}
return res;
}
}
如果set当中包含了当前字符证明,现在就是以当前字符开头的最长子串,将所有的最长子串拿出来,进行比较就可以拿出最长的子串:
示例:
字符串:abcab
-
第一次循环set为空a没出现,此时set变成了a。
-
第二次循环b在set当中没出现,set变成了a,b。
-
第三次循环c在set当中没出现,set变成了a,b,c。
-
第四次循环a在set当中出现了,则a开头的子串最长为abc。
-
此时开始b打头的子串循环,一次类推到结束即可获得最大子串长度。
-
注意向后切换子串的时候是将set的头部位置移除。
本方法的时间复杂度为O(n)