无重复字符的最长子串问题是 LeetCode 经典题目之一,要求找出一个给定字符串中不含有重复字符的最长子串的长度。
给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度。
使用滑动窗口(双指针)和哈希集合的方法解决该问题:
left 和 right 表示滑动窗口的左右边界,初始都指向字符串的开头。set 存储当前窗口内的字符,初始为空。s,右指针 right 不断向右移动,将字符加入 set 中,直到遇到重复字符。left 向右移动,直到将重复字符移出窗口,同时从 set 中移除这些字符。public int lengthOfLongestSubstring(String s) {
int n = s.length();
Set<Character> set = new HashSet<>();
int maxLength = 0, left = 0, right = 0;
while (right < n) {
char ch = s.charAt(right);
while (set.contains(ch)) {
set.remove(s.charAt(left));
left++;
}
set.add(ch);
maxLength = Math.max(maxLength, right - left + 1);
right++;
}
return maxLength;
}left 和 right 各遍历一次字符串。set 最多存储字符集的大小个元素。设计不同测试用例,包括空字符串、全重复字符、无重复字符等情况,验证算法的正确性和效率。
无重复字符的最长子串问题是一个经典的滑动窗口应用问题。通过本文的详细讲解和算法实现,可以有效地解决该问题,找出字符串中不含重复字符的最长子串的长度。