题目大意:删除字符,当一个字符左边或者右边存在一个比它小“1”的字符那么就可以将这个字符删除,问最多能删除多少个字符
思路,:刚开始想的是,对于单调连续的字符,可以直接删除,比如,单点增的字符只保留前边的就行了,单调减的只保留后边的。。。然后知道不能删除为止。然后wa了一下午。。
正解是复杂度是O(26*n*n),并且用到了string 里的erase
补充:
string::erase 用法:
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(s.begin()+c,s.begin()+c+t);删除从c开始向后查t个字符。
#include<bits/stdc++.h> using namespace std; const int inf=0x3f3f3f3f; const int N=110; string s; int n; bool solve()//尝试删除一个字母 { for(int j=26;j>=1;j--) for(int i=0;i<s.size();i++){ if(s[i]!='a'+j) continue; if(i>0) if(s[i-1]=='a'+j-1){ s.erase(i,1); return true; } if(i<s.size()-1) if(s[i+1]=='a'+j-1){ s.erase(i,1); return true; } } return false; } int main() { scanf("%d",&n); cin>>s; int ans=0; while(solve()) ans++; printf("%d\n",ans); }