采用滑动窗口算法,有点类似于低配版的KMP,比较容易,具体实现见AC代码注释.有些细节还是比较值得注意的.
class Solution {
public:
static int lengthOfLongestSubstring(string s) {
int isSeen[128]; // 由于题目中出现的是ASCII码,所以用数组是绰绰有余了,不必用到哈希
memset(isSeen, 0, sizeof(isSeen));
int le = 0, ri = -1, ans = 0; // 最需要注意的是右侧指针ri的初始值,因为子串s[0]~s[0]也是必须要判断滴~
int len = s.length(); // 这个需要注意一下,每次求s.length(),时间复杂度为O(n)的..
for (; le < len; ++le) {
if (le > 0) isSeen[s[le - 1]] = 0;
while (isSeen[s[ri + 1]] == 0 && ri < len - 1) isSeen[s[++ri]] = 1; // 注意,是往ri右侧一个字符眺望的
ans = max(ans, ri-le+1);
}
return ans;
}
};
原文:https://www.cnblogs.com/tsuipo/p/12819817.html