题目链接:点击查看
题目大意:给出一个长度不超过100且只包含小写字母的字符串,现在规定,如果某个位置 i 的相邻位置存在着当前位置所代表字母的前一个字母,即 i - 1 和 i + 1 中存在着 a[ i - 1] = a[ i ] - 1 或 a[ i + 1 ] = a[ i ] - 1 ,则代表位置 i 的字母可以删除,两侧子串拼接起来,问最多可以进行删除操作多少次
题目分析:读懂题后首先需要知道,字母 ' a ' 是一定不可能删除的,因为题目中规定 a 没有前一个字母,这样的话我们就可以贪心,每次对最大的字母进行尝试删除,因为字符串最长只有100,所以我们每次可以 26 * n 的时间复杂度找到一个可以删除的字母并进行删除,最多只需要删除 n 次,总时间复杂度也就是 26 * n * n,每次只删除一个字母,直到不能删除为止
删除操作直接模拟就好了,配合stl的string类可以轻松完成
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
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()
{
#ifndef ONLINE_JUDGE
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
// ios::sync_with_stdio(false);
//ccab
//ddbc
scanf("%d",&n);
cin>>s;
int ans=0;
while(solve())
ans++;
printf("%d\n",ans);
}