全A了,提供下项链O(N)解法,代码可以更精简点,过了就没管了
#include <iostream>
#include <string>
#include <deque>
using namespace std;
int cut(const string &neck)
{
int i = 0;
int j = 0;
int mini = neck.length() / 2;
int flag[5] = {0};
int count_f = 5;
deque<char> deq;
deque<int> pos;
while(i < neck.length() / 2 && j < neck.length())
{
if(neck[j] <= 'E')
{
if(deq.empty())
{
i = j;
deq.push_back(neck[j]);
pos.push_back(j);
flag[neck[j] - 'A'] = 1;
count_f--;
}
else if(deq.front() == neck[j])
{
deq.push_back(neck[j]);
pos.push_back(j);
flag[neck[j] - 'A']++;
char head = deq.front();
while(flag[head - 'A'] > 1)
{
deq.pop_front();
pos.pop_front();
flag[head - 'A']--;
head = deq.front();
i = pos.front();
};
}
else
{
deq.push_back(neck[j]);
pos.push_back(j);
if(flag[neck[j] - 'A'] == 0)
{
count_f--;
}
flag[neck[j] - 'A']++;
}
if(count_f == 0)
{
if(mini > j - i + 1)
{
mini = j - i + 1;
}
}
}
j++;
}
return neck.length() / 2 - mini;
}
int main()
{
string neck;
while(cin>>neck)
{
cout<<cut(neck + neck)<<endl;
}
return 0;
}