1.使用unordered_set,思想是队列的,但是队列没有find函数,所以用无序set
#include <iostream>
#include <algorithm>
#include <unordered_set>
#include <string>
using namespace std;
int fun(string s);
int main()
{
string s;
getline(cin, s);
cout << fun(s);
}
int fun(string s)
{
if (s.size() == 0)
{
return 0;
}
int left = 0;
int MAX = 0;
unordered_set<char> a;
for (int i = 0; i < s.size(); i++)
{
while (a.find(s[i]) != a.end())
{
a.erase(s[left]);
left++;
}
MAX = max(MAX, i - left + 1);
a.insert(s[i]);
}
return MAX;
}
2.今天学的双“指针”法
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int fun(string s);
int main()
{
string s;
getline(cin, s);
cout << fun(s);
}
int fun(string s)
{
int i = 0,j,k,max = 0,len;
for(j=i;j<s.size();j++){
for(k=i;k<j;k++){
if(s[k]==s[j]){
len = j-i;
if(len > max) max =len;
i = k+1;
break;
}
}
}
return j-i>max?j-i:max;
}
极简之道,建议不懂得朋友们画图试一试“abcdacb”这个字符串的流程,草稿本上试一次流程就明白了
3.另一种双指针
#include <iostream>
#include <algorithm>
#include <algorithm>
#include <string>
using namespace std;
int fun(string s);
int main()
{
string s;
getline(cin, s);
cout << fun(s);
}
int fun(string s)
{
int start = 0, end = 0, maxlen = 0;
char map[256] = { 0 };
map[(int)(s[start])] = 1;
while ((s[end]) != 0)
{
maxlen = maxlen > (end - start + 1) ? maxlen : (end - start + 1);
++end;
while (0 != map[(int)(s[end])])//将要加入的新元素与map内元素冲突
{
map[(int)(s [start])] = 0;
++start;
}
map[(int)(s[end])] = 1;
}
return maxlen;
}