3.无重复字符的最长子串
题目描述
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
示例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
由英文字母、数字、符号和空格组成
代码演示
Java 滑动窗口
import java.util.*;
public class OneQuestionPerDay3 {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.lengthOfLongestSubstring("abcabcbb"));
System.out.println(s.lengthOfLongestSubstring("bbbbb"));
System.out.println(s.lengthOfLongestSubstring("pwwkew"));
System.out.println(s.lengthOfLongestSubstring(""));
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length()==0)
return 0;
Map<Character, Integer> map = new HashMap<>();
int len = 0;
int Start = 0;
for(int i = 0; i < s.length(); i++){
// 出现重复字符,将Start位置移动
if(map.containsKey(s.charAt(i))){
Start = Math.max(Start ,map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i),i);
len = Math.max(len, i - Start + 1);
}
return len;
}
}
时间复杂度O(n)
Java 滑动窗口 提交结果
执行用时:7 ms, 在所有 Java 提交中击败了79.43% 的用户
内存消耗:38 MB, 在所有 Java 提交中击败了99.53% 的用户