string类型
string s;
s.size()是长度,每一个s[i]的类型是char
无重复字符的最长子串
第一次用哈希表写的,超过了时间限制
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> hash;
int num = 0, ans = 0;
for(int i = 0; i < s.size(); i++)
{
if(i == 0)
{
hash.insert({s[i], num++});
continue;
}
auto it = hash.find(s[i]);
if(it != hash.end())
{
ans = max(ans, num);
num = 0;
i = it->second;
hash.clear();
hash.insert({s[i], num++});
}
else
{
hash.insert({s[i], num++});
}
}
return max(ans, num);
}
};
超出时间限制的原因是每次都重新从最前面开始导致时间过长,应该使用滑动窗口,通过双指针优化
修改后的代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> hash;
int num = 0, ans = 0;
int i = 0, j = 0;
while(i < s.size() && j < s.size())
{
if(hash.find(s[j]) == hash.end()) //不重复,窗口右移
{
hash.insert({s[j], j});
j++;
num++;
}
else //重复了,把最前面的删了即窗口左移
{
ans = max(ans, num);
hash.erase(s[i]);
i++;
num--;
}
}
return max(ans, num);
}
};
剩下的都是哈希表的算法内容进行了复习