O(n)双指针。
code
#include <iostream>
#include <climits>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
string longest(string str)
{
int longest = 0;
int longest_start = -1;
int occurance[256];
int count = 0;
memset(occurance, 0, sizeof(occurance));
int len = str.size();
int start = 0;
for(size_t i = 0; i<len; i++)
{
occurance[str[i]]++;
if(occurance[str[i]] == 1)
count++;
if(count == 3)
{
cout << i << "start" << endl;
if(i-start > longest)
{
longest = i-start;
longest_start = start;
cout << i << " longest " << longest << endl;
}
while(count == 3)
{
occurance[str[start]]--;
if(occurance[str[start]] == 0)
count--;
start++;
}
}
}
if(len - start > longest)
{
longest = len-start;
longest_start = start;
}
return str.substr(longest_start, longest);
}
int main()
{
cout << longest("aabadefghaabbaa") << endl;
return 0;
}