今天第二次写这个题,竟然在哈希那块给卡住了,写个博客记录一下.
该题还有一种解法就是两层for循环套着 ,也就是暴力求解,所耗费时间较长,没有什么实际的意义,在此就不说了.
上图即为题示:题解及代码每一步的运行详解如下:
附上代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> occ;// 哈希集合,记录每个字符是否出现过
int n = s.size(); //算出string s的长度
int rk = -1, ans = 0; //rk即为初始指针的位置 在string s的左侧 所以其值为-1
for (int i = 0; i < n; ++i) {
if (i != 0) {
occ.erase(s[i - 1]); //
}
while (rk + 1 < n && !occ.count(s[rk + 1])) {
// 不断地移动右指针
occ.insert(s[rk + 1]);
++rk;
}
ans = max(ans, rk - i + 1); //ans = 1
}
return ans;
}
};
下面再附上这俩代码提交的时间对比:
暴力求解的解法所需时间以及内存消耗.
哈希: