3. 无重复字符的最长子串
1)题目
给定一个字符串 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 由英文字母、数字、符号和空格组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2)思路
1.思路一
遍历字符串添加字符,
从第一个字符开始,只要有重复字符出现,
结果字符串初始化为"",下标变为第二个字符,继续遍历添加,
每次循环记录子串长度,直到遍历完成,返回结果。
2.思路二:滑动窗口
这题是滑动窗口的题目,用滑动窗口再做了一遍。
什么是滑动窗口?
在算法中,滑动窗口通常用来处理连续子数组或子串的问题。通过定义窗口的起始和结束位置,在每一轮迭代中,通过移动窗口的起始位置或结束位置来更新窗口内的元素,从而得到问题的解。
3)代码
1.方法一
public static int lengthOfLongestSubstring(String s) {
String result = "";
int index = 0;
int length = 0;
for (int i = 0; i < s.length(); i++) {
if (result.contains(String.valueOf(s.charAt(i)))) {
i = index++;
result = "";
} else {
result = result + s.charAt(i);
}
if (result.length() > length) length = result.length();
}
return length;
}
2.方法二:滑动窗口
public static int lengthOfLongestSubstring(String s) {
if (s.length() < 2) return s.length();
int maxLen = 0; // 用于记录最大不重复子串的长度
int left = 0; // 滑动窗口左指针
Map<Object, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
// 如果map里包含当前字符,则左指针移动到当前重复元素的下一位
// abca a重复 指针移动到b
if (map.containsKey(s.charAt(i))) {
left = Math.max(left, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i); // 记录当前i的下标
maxLen = Math.max(maxLen, i - left + 1);
}
return maxLen;
}