【力扣热题100】[Java版] 刷题笔记-3. 无重复字符的最长子串
题目:3. 无重复字符的最长子串
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路
根据题目,只需要返回无重复字符串的最长子串的长度,所以我们不需要知道知道字符串内容是什么,在整个字符串 s 中,我们可以依次循环遍历字符串,以当前字符为起点,判断该字符为起点之后的不重复字符串长度,再与当前最长的长度进行比较,取较大值返回。
例如题目中:
s = abcabcbb
循环开始
以 (a)bcabcbb 开始, 不重复最长字符串为 abc ,长度为3
以 a(b)cabcbb 开始, 不重复最长字符串为 bca ,长度为3
以 ab(c)abcbb 开始, 不重复最长字符串为 cab ,长度为3
......以此类推
解题过程
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() == 1) {
return 1;
}
Set<Character> repeat = new HashSet<>();
int max = 0, rk = -1;
for (int i = 0; i < s.length(); i++) {
if (i != 0) {
repeat.remove(s.charAt(i - 1));
}
while (rk + 1 < s.length() && !repeat.contains(s.charAt(rk + 1))) {
repeat.add(s.charAt(rk + 1));
rk++;
}
max = Math.max(max, rk - i + 1);
}
return max;
}
}