N

题目大意:删除字符,当一个字符左边或者右边存在一个比它小“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
",ans);
 
}

    

原文地址:https://www.cnblogs.com/Accepting/p/12470002.html