Skip to content

Commit 48d5a10

Browse files
committed
新增1题,共4题
1 parent 6ff8f01 commit 48d5a10

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.cjl.leetcode;
2+
3+
import java.util.HashMap;
4+
import java.util.HashSet;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
/*
9+
3. 无重复字符的最长子串
10+
问题描述:
11+
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
12+
示例 1:
13+
输入: s = "abcabcbb"
14+
输出: 3
15+
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
16+
示例 2:
17+
输入: s = "bbbbb"
18+
输出: 1
19+
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
20+
示例 3:
21+
输入: s = "pwwkew"
22+
输出: 3
23+
解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。
24+
请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子串。
25+
示例 4:
26+
输入: s = ""
27+
输出: 0
28+
提示:
29+
0 <= s.length <= 5 * 10^4
30+
s 由英文字母、数字、符号和空格组成
31+
*/
32+
public class Question_3 {
33+
34+
// 滑动窗口
35+
// 时间复杂度是O(N),空间复杂度是O(N)
36+
public static int solution1(String s) {
37+
int max = 0;
38+
int left = 0;
39+
Map<Character, Integer> map = new HashMap<>();
40+
for (int i = 0; i < s.length(); i++) {
41+
if (map.containsKey(s.charAt(i))) {
42+
left = Math.max(map.get(s.charAt(i)), left);
43+
}
44+
map.put(s.charAt(i), i + 1);
45+
max = Math.max(max, i - left + 1);
46+
}
47+
return max;
48+
}
49+
50+
// set解法
51+
// 时间复杂度是O(N),空间复杂度是O(N)
52+
public int solution2(String s){
53+
int max = 0;
54+
int left = 0;
55+
int right = 0;
56+
Set<Character> set = new HashSet<>();
57+
while(left < s.length() && right < s.length()){
58+
if(set.contains(s.charAt(right))){
59+
set.remove(s.charAt(left++));
60+
}else{
61+
set.add(s.charAt(right++));
62+
max = Math.max(max,right - left);
63+
}
64+
}
65+
return max;
66+
}
67+
}

0 commit comments

Comments
 (0)