Codeforces Round #625 (Div.2) C.Remove Adjacent(贪心)

思路:
1.从大到小枚举字母c;
2.从字符串string的开头访问到结尾,如果有删去字符,则需要从string开头重新开始访问(比如test10里面的“bbbbbbbbabbbb”这种情况)
3.如果把字符串访问一便以后没有删去任何一个字符,则flag=0;退出while循环,继续枚举下一个字母c-1。

===============================================
看到有些题解在2.的情况即删去字符后重新开始大循环(字母从大到小枚举)这样的话复杂度O(26N^2),
其实大可不必,
我们提出假设:如果删去了字母c,则对字符串中str[i]>c的字符是否可删除没有影响。
这样就可以O(26
N)
…ab?..
设"?">“b”:如果b可删除,则a=b-1;?在当前情况不能消除,所以b<"?"-1;
又因为当且仅当a="?"-1时"?“可删除;a=b-1<”?"-2,显然不能消除啦

#include
#include 
#include
#include
using namespace std;
string str;
int main(){
	int n;
	cin>>n;
	getchar();
	cin>>str;
	int countt=0;//记删去数量
	for(int c=26+'a';c>'a';c--){//从大到小枚举字母
		bool flag=1;//标记
		while(flag){
			flag=0;//如果没有删去任何字符,则继续枚举下一个字母
			for(int i=0;i<n;i++){//访问字符串的每个字母
				if(str[i]==c){
					if(i!=n-1&&str[i+1]==c-1){
						str.erase(i,1);
						n--;//记得删去后总数要减少
						countt++;
						flag=1;
						break;
					}
					else if(i!=0&&str[i-1]==c-1){
						str.erase(i,1);
						n--;
						countt++;
						flag=1;
						break;
					}
				}
			}
		}
	}
	cout<<countt;
}

你可能感兴趣的:(贪心)