自己写的,实例没错,但是提交WA
#include<iostream>
#include<string>
using namespace std;
string str_remain(string str){
string::iterator first = str.begin();
while (!str.empty()&&first < str.end() - 1){//
int cnt = 0;
while (first!=str.end()-2 && *first==*(first+1)){//
cnt++;
first++;
}
if (*(str.end()-2)==*(str.end()-1)){
cnt++;
first++;
}
if (cnt > 0){
first=str.erase(first-cnt,first+1);
}
if (first!=str.end())
first++;
}
return str;
}
int max_remove(string str){
char abc[3] = { 'A', 'B', 'C' };
int max_sum = 0;
for (int i = 0; i < 3;i++){
string::iterator first=str.begin();
while (first!=str.end()){
first = str.insert(first,abc[i]);//
string tmp = str;
string res;
while (tmp != (res = str_remain(tmp))){
tmp = res;
int sum = str.size() - res.size();
if (sum>max_sum){
max_sum = sum;
}
}
first=str.erase(first);
first++;
}
}
return max_sum;
}
int main(){
int T;
cin >> T;
while (T--){
string str;
cin >> str;
cout << max_remove(str)<<endl;
}
return 0;
}
网上这段代码跟我思路相仿,AC了,这段代码优点如下:
1.对于string 能不用insert()和erase()函数就尽量避免使用,因为引起的迭代器更新的问题很头疼
下面代码使用substr()完美的避免了这个问题。string的substr()主要有两种用法(C++ Prime P341):
1)s.substr(pos,n)
2)s.substr(pos)
2.freopen(“a.txt”,”r”,stdin);使用重定向,避免手动重复输入
其实这段代码没有考虑在头前和尾后插入
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
char in[3]={'A','B','C'};
string getstring(string str)
{
int l=str.length();
if(l<=1) return str; //这里需要注意
string ss="";
for(int i=0;i<l-1;i++)
{
if(str[i]==str[i+1])
{
while(i+1<l&&str[i]==str[i+1]) i++;
}
else ss+=str[i];
}
if(str[l-1]!=str[l-2]) ss+=str[l-1];
return ss;
}
int main()
{
//freopen("a.txt","r",stdin);
int t,max;
string s;
cin>>t;
while(t--)
{
cin>>s;
max=0;
for(int i=0;i<s.length()-1;i++)
{
for(int j=0;j<3;j++) //两重循环枚举。
{
string str=s.substr(0,i+1)+in[j]+s.substr(i+1);
int len=str.length();
str=getstring(str);
while(len>str.length())
{
len=str.length();
str=getstring(str);
}
if(s.length()+1-len>max) max=s.length()+1-len;
}
}
cout<<max<<endl;
}
return 0;
}