class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.size() == 0)
{
return 0;
}
unordered_set<char> lookup;
int maxStr = 0;
int left = 0;
for (int i = 0; i < s.size(); i ++ )
{
while (lookup.find(s[i]) != lookup.end())
{
lookup.erase(s[left]);
left ++;
}
maxStr = max(maxStr, i - left + 1);
lookup.insert(s[i]);
}
return maxStr;
}
};
这段代码是一个用于解决“最长不含重复字符的子字符串”问题的C++解决方案。问题可以描述为:给定一个字符串,找到最长的不包含重复字符的子字符串的长度。
这里是代码的详细讲解:
class Solution
:定义一个名为Solution的类,通常在编程题解中使用,用来包含一个或多个函数,这些函数解决特定的问题。
public:
:访问修饰符,表示下面的成员(函数或变量)可以被类的外部访问。
int lengthOfLongestSubstring(string s)
:这是类中的一个公共成员函数,它接受一个字符串s
作为参数,并返回一个整数,表示最长的不含重复字符的子字符串的长度。
if (s.size() == 0) { return 0; }
:如果输入的字符串为空,那么最长的子字符串长度显然为0,直接返回0。
unordered_set<char> lookup;
:创建一个无序集合lookup
,用来存储在当前不含重复字符的子字符串中的字符。由于unordered_set
是一个集合,它不会存储重复的元素,这有助于快速判断一个字符是否已经在子字符串中。
int maxStr = 0;
:初始化一个变量maxStr
,用来记录遇到的最长子字符串的长度。
int left = 0;
:初始化一个变量left
,用来记录不含重复字符的子字符串的左边界。
for (int i = 0; i < s.size(); i++)
:遍历字符串s
中的每个字符。
while (lookup.find(s[i]) != lookup.end())
:这是一个内部循环,用来移除子字符串左边界left
到i
之间的重复字符。如果当前字符s[i]
已经在集合lookup
中,说明它是一个重复字符,需要移动左边界left
,直到s[i]
不再在集合中。
lookup.erase(s[left]);
:从集合lookup
中移除左边界处的字符。
left++;
:左边界向右移动一位。
maxStr = max(maxStr, i - left + 1);
:更新最长子字符串的长度。当前子字符串的长度是i - left + 1
,用max
函数比较它与之前的最大长度maxStr
。
lookup.insert(s[i]);
:将当前字符s[i]
插入到集合lookup
中,表示它现在在当前不含重复字符的子字符串中。
return maxStr;
:在遍历完整个字符串后,返回最长的不含重复字符的子字符串的长度。这个算法的时间复杂度是O(n),其中n是字符串的长度。尽管内部有一个while循环,但是每个字符最多只会被插入和删除一次,因此总的运行时间是线性的。