算法1 双指针算法 时间复杂度 O(n), 空间复杂度 O(1)
思路
整体上:
双指针i,j同时扫描, j一直往后面走,直到出现重复,i向后走,直到没有重复, 更新最大的长度
细节上:
1. 字符不仅仅是英文字母,ASCII码 128,但是用扩展ASCII码 256 比较保险
2. i向后走到s[i] == s[j] 时还要往后走一个,跳过重复
class Solution {
public:
int lengthOfLongestSubstring(string s) {
bool st[290] = {false};
int res = 0;
for (int i = 0, j = 0; j < s.size(); ++j) {
if (st[s[j]]) {
while (s[i] != s[j]) st[s[i++]] = false;
st[s[i++]] = false;
}
st[s[j]] = true;
res = max(j - i + 1, res);
}
return res;
}
};
附加yxc老师的代码供参考
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> hash;
int res = 0;
for (int i = 0, j = 0; j < s.size(); j ++ )
{
hash[s[j]] ++ ;
while (hash[s[j]] > 1) hash[s[i ++ ]] -- ;
res = max(res, j - i + 1);
}
return res;
}
};