class Solution {
public:
int lengthOfLongestSubstring(string s)
{
int m[256] = { 0 }, res = 0, left = 0;
for (int i = 0; i < s.size(); ++i)
{
if (m[s[i]] == 0 || m[s[i]] < left)
{
res = max(res, i - left + 1);
}
else
{
left = m[s[i]];
}
m[s[i]] = i + 1;
}
return res;
}
public:
int lengthOfLongestSubstring(string s)
{
int m[256] = { 0 }, res = 0, left = 0;
for (int i = 0; i < s.size(); ++i)
{
if (m[s[i]] == 0 || m[s[i]] < left)
{
res = max(res, i - left + 1);
}
else
{
left = m[s[i]];
}
m[s[i]] = i + 1;
}
return res;
}
};
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
vector<int> dict(256, -1);
int maxLen = 0, start = -1;
for (int i = 0; i != s.length(); i++) {
if (dict[s[i]] > start)
start = dict[s[i]];
dict[s[i]] = i;
maxLen = max(maxLen, i - start);
}
return maxLen;
}
};
看的别人的两种方法,记录下,第一个中的m[s[i]] < left,网上解释是:
我们用一个例子来说明,当输入字符串为"abbca"的时候,当i=4时,也就是即将要开始遍历最后一个字母a时,此时哈希表表中a对应1,b对应3,c对应4,left为2,即当前最长的子字符串的左边界为第二个b的位置,而第一个a已经不在当前最长的字符串的范围内了,那么对于i=4这个新进来的a,应该要加入结果中,而此时未被更新的哈希表中a为1,不是0,如果不判断它和left的关系的话,就无法更新结果,那么答案就会少一位,所以需要加m[s[i]] < left。