class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
int lengthOfLongestSubstring(string s) {
int n = s.size();
int ans = 0;
int l = 0, r = 0;
unordered_set<int> st;
while (r < n && l <= r) {
// 向右遍历,当新元素一直未在st中出现时,st插入新元素,同时右移
while (st.find(s[r]) == st.end() && r < n) {
st.insert(s[r]);
r++;
}
// 找到了一个重复元素,更新此时的最长长度,同时在st中删去l并使l左移
ans = max(ans, (int)st.size());
st.erase(l);
l++;
}
return ans;
}
};
时间复杂度:O(n),数组中的每个字符最多只遍历两次,即 l 指针一次, r 指针一次
空间复杂度:O(n),用于 st 集合,最坏情况下大小等于 n

京公网安备 11010502036488号