题目
给定一个字符串 s s s ,请你找出其中不含有重复字符的最长的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0
0
0
<
=
<=
<= s.length
<
=
<=
<=
5
5
5
∗
*
∗
1
0
4
10^4
104
s
s
s 由英文字母、数字、符号和空格组成
题解
C++
解法1:双重循环暴力
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s == "") return 0;
set<char> set;
int res = INT_MIN, len = s.size();
for(int i = 0; i < len; i++) {
for(int j = i; j < len; j++) {
auto c = s[j];
if(set.find(c) == set.end()) set.insert(c);
else {
int l = set.size();
res = max(res, l);
set.clear();
break;
}
}
}
res = max(res, static_cast<int>(set.size()));
return res;
}
};
解法2:哈希+双指针
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s == "") return 0;
int len = s.size();
unordered_map<char, int> map;
int left = 0, res = INT_MIN;
for(int right = 0; right < len; right++) {
char c = s[right];
map[c]++;
while(map[c] > 1) map[s[left++]]--;
res = max(res, right - left + 1);
}
return res;
}
};
C
双指针
int lengthOfLongestSubstring(char * s)
{
int head=0,tail=0,max=0;//右指针 左指针
int len=strlen(s);
while(tail<len)
{
int i=head;
for(i=head;i<tail;i++)
{
if(s[tail]==s[i])
{
max=tail-head>max?tail-head:max;
head=i+1;
break;
}
}
tail++;
max=tail-head>max?tail-head:max;
}
return max;
}
Java
哈希
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> hashset=new HashSet<>();
int right=-1,res=0;
for(int left=0;left<s.length();left++){
if(left!=0){
hashset.remove(s.charAt(left-1));
}
while(right+1<s.length()&&!hashset.contains(s.charAt(right+1))){
hashset.add(s.charAt(right+1));
right++;
}
res=Math.max(res,right-left+1);
}
return res;
}
}