c++:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//s[start,end) 前面包含 后面不包含,初始化起始指针,长度和结果
int start = 0, end = 0, length = 0, result = 0;
while(end < s.size()){
char tmpchar = s[end];
for(int i = start; i < end; i++){
//发现有重复字符时,可以直接把左指针移动到第一个重复字符的下一个位置即可。
if(tmpchar == s[i]){//若尾指针等于遍历的索引值,如abcb,s[i]是第一个b,tmpchar是第二个b
start = i + 1;//start的索引变成c
length = end - start;//求长度,长度还需要在后面加1
break;
}
}
end++;//end加1,逐长度遍历
length++;//长度加1
result = max(result,length);
}
return result;
}
};
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char>st;
int r = 0;//滑动窗口右边
int ans = 0;
for(int i = 0; i < s.size(); i++){
if(i != 0){
st.erase(s[i-1]);//i为滑动窗口左边,左边移动一次,就删掉一个元素
}
while(r < s.size() && st.count(s[r]) == 0){//右边界移动
st.insert(s[r]);//s[r]插入set中
r++;
}
ans = max(ans, r - i);//r-i+1为右边-左边
}
return ans;
}
};
go:
func lengthOfLongestSubstring(s string) int {
//哈希集合,记录字符是否出现过
m := map[byte]int{}
n := len(s)
//右指针
r := 0
ans := 0
for i := 0; i < n; i++{
if i != 0{
//左指针移动一步,则删除一个字符
delete(m,s[i-1])
}
for r < n && m[s[r]] == 0{//不断移动右指针
m[s[r]]++
r++
}
ans = max(ans, r - i)
}
return ans
}
func max(x,y int)int{
if x < y{
return y
}else{
return x
}
}