·链表操作+迭代器 字符消除

绝世大坑:

list.insert(it,xx)是在it前面插入。如果想在it后面插入最好用list.insert(++(tmp=it),xx)。  list.insert(it,x)一般返回it下一个元素。

感受下:

#include <iostream>
#include <list>
#include <vector>
using namespace std;
typedef list<char>::iterator It;
void display(list<char>& lst){//for debug
	for(It it=lst.begin();it!=lst.end();it++){
		cout<<*it<<" ";
	}cout<<endl;
}
int calc(list<char>&_lst)
{
	int size0=_lst.size();
	if(size0==0)
		return 0;

	int cnt=0;

	list<char>::iterator tmp,it=_lst.begin();
	char s[4]="ABC";
	while(it!=_lst.end()){

		for(int i=0;i<3;i++){
			// tmp=_lst.insert(it,s[i]);//分别尝试在同一个位置插入A/B/C
			_lst.insert(++(tmp=it),s[i]);//分别尝试在同一个位置(it后面)插入A/B/C
			list<char> lst=_lst;
			while(true)
			{
				int size=lst.size();
				for(list<char>::iterator it=lst.begin();it!=lst.end();)
				{
					bool tag=false;
					list<char>::iterator tmp=it;
					tmp++;
					while(tmp!=lst.end()&&*it==*tmp)
					{
						tmp=lst.erase(tmp);
						tag=true;
					}
					if(tag)
						it=lst.erase(it);
					else
						it++;
				}///一轮消除完毕
				if(lst.size()==size)//消除完毕
					break;
			}
			cnt=max(cnt,(int)(size0+1-lst.size()));
			_lst.erase(++(tmp=it));//删除刚刚插入的元素(it下一个节点)
		}
		it++;
	}

	return cnt;
}
int main()
{
	list<char>lst;
	int n;
	cin>>n;
	char buf[1000];
	for(int i=0;i<n;i++)
	{
		cin>>buf;
		lst.clear();
		for(int j=0;buf[j]!=0;j++)
		{
			lst.push_back(buf[j]);
		}
		cout<<calc(lst)<<endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值