Longest Substring Without Repeating Characters
题意
给定一个字符串,返回其无重复字符的最长子串的长度。
题解
Way 1. 尺取法。
时间复杂度:
O(nlogn)
// 132ms
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> S;
int L = 0, R = 0, n = s.length();
int ans = 0;
while(R < n){
while(R < n && !S.count(s[R])) S.insert(s[R++]);
ans = max(ans, R - L);
S.erase(s[L++]);
}
return ans;
}
};
Way 2.
因为是字符串,可以不用set
来判断某字符是否访问过,直接用一个数组映射。
时间复杂度:
O(n)
// 8ms
int lengthOfLongestSubstring(char* s) {
/*int set[128] = {0}, ans = 0;
char *ps = s, *pe = s;
while(*pe){
if(set[*pe]){
ans = (pe - ps > ans) ? pe - ps : ans;
while(*ps != *pe) set[*ps++] = 0;
ps++, pe++;
}
else{
set[*pe++] = 1;
}
}
return (ans > pe - ps) ? ans : pe - ps;*/
int set[128] = {0}, ans = 0;
char *ps = s, *pe = s;
while(*pe){
while(*pe && !set[*pe]) set[*pe++] = 1;
ans = (pe - ps > ans) ? pe - ps : ans;
set[*ps++] = 0;
}
return ans;
}