LeetCode:3.无重复字符的最长子串

题目:无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。

示例 1:

1
2
3
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

1
2
3
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

1
2
3
4
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
int lengthOfLongestSubstring(string s) {
std::unordered_set<char> chars;
int maxLength = 0;
int size = s.size();
for (int i = 0; i < size; i++) {
chars.emplace(s[i]);
int left = i;
int right = i;
for (int j = i + 1; j < size; j++) {
if (chars.count(s[j]) == 0) {
chars.emplace(s[j]);
right++;
} else {
break;
}
}
chars.clear();
int length = right - left + 1;
maxLength = max(maxLength, length);
}
return maxLength;
}
};

思路2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution{
public:
int lengthOfLongestSubstring(string s){
int n = s.length();
unordered_map<char,int> h;
int l=0;
int res=0;
for(int r=0;r<n;r++){
h[s[r]]++;
while(h[s[r]]>1){
h[s[l++]]--;
}
res = max(res,r-l+1);
}
return res;
}
};

总结

思路2的时间复杂度和空间复杂度明显好于思路1