#include<vector>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
/*
//暴力解法,无法通过最后一个很大的测试用例
int lengthOfLongestSubstring(string s) {
if (s == "")
return 0;
vector<int> strlengths;
set<char> charset; //保存字符
int len = 0;
bool overflag = false;//若已经找到i开头的最长子串,可以提前结束j的循环
for (auto i = s.begin(); i != s.end(); ++i)
{//左指针
overflag = false;
len = 0;
for (auto j = i; j != s.end(); ++j)
{//右指针
if (charset.count(*j))
{
overflag = true;
break;
}
else
{
++len;
charset.insert(*j);
}
}
strlengths.push_back(len);
charset.clear();
}
sort(strlengths.begin(), strlengths.end());
return strlengths.back();
}
*/
int getMax(int a, int b)
{
if (a > b)
return a;
else
return b;
}
//滑动窗口方式
int lengthOfLongestSubstring(string s)
{
if (s == "")
return 0;
int maxlength = 0; //最大长度
map<char, int> hashmap;//用于保存各个字符最后一次出现位置的序号
int i = 0,j = 0; //i、j分别为串的最左元素序号以及最右元素序号
int index;//用于保存临时查找到的位置序号
for (i = 0,j = 0; j < s.length(); j++)
{
if (hashmap.count(s[j])&&(index = hashmap.find(s[j])->second)>=i)
{//如果hashmap中已经有该字符了,且该字符在当前子串范围内
//auto iter = hashmap.find(s[j]);//找到该字符上一次出现的位置
//index = iter->second; //将上一次出现位置的下一个元素赋给i
i = index + 1;
hashmap[s[j]] = j; //更新该字符的出现位置
maxlength = getMax(maxlength, j - i + 1);//更新最大长度
}
else
{//如果hashmap中还未拥有该字符,将该字符加入map
hashmap[s[j]] = j;
maxlength = getMax(maxlength, j - i + 1);//更新最大长度
}
}
return maxlength;
}
int main()
{
cout<<lengthOfLongestSubstring("abcdfeddfdfdf");
}