C. Remove Adjacent(ranting 1600)超详细题解
前言
本系列的意义在于两点,一则是作为本人(一个编程初学者)的学习笔记记录,二则希望能对后来者提供一些帮助,因为本人也为新手,难免有些错误或讲述不清之处,恳请大家指出或提出建议,本人也会虚心修改。
本系列的目标是帮助大家解决一些codeforces上,ranting1600+(或者之后会改为1300+,看博主水平吧)的题目
一、题目及翻译
1. 原题(贴图)
2. 翻译
- 机翻版
- 省流版
对字符串S进行处理,删除其中的字符S[i],这个s[i]相邻的有比它小1的,就可以删除,求最多可以删多少个
二、解析及AC代码
1.解析
首先每次对最大的字母进行尝试删除,因为字符串最长只有100,所以我们每次可以 26 * n 的时间复杂度找到一个可以删除的字母并进行删除,最多只需要删除 n 次,总时间复杂度也就是 26 * n * n,每次只删除一种字母,直到不能删除为止
那么,此时同学们就可以自己去尝试一下了,如果还是不太理解,可以参考下博主下面的AC代码
2.AC代码
#define _CRT_SECURE_NO_WARNINGS 01
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10, M = 2e5 + 10;
int n, t, k, m;
char s[N];
bool st[N];
vector<int>q[26];
void solve()
{
int res = 0;
cin >> n;
scanf("%s", s);
for (int i = 25; i > 0; i--)
{
char y = i + 'a', z = i - 1 + 'a';
for (int j = 0; j < n; j++)
{
if (s[j] == y)
{
int l = j - 1, r = j + 1;
while (s[l] == '0' || s[l] == y)
{
l--;
}
if (l >= 0)
{
if (s[l] == z)
{
res++;
s[j] = '0';
continue;
}
}
while (s[r] == '0' || s[r] == y)
{
r++;
}
if (r < n)
{
if (s[r] == z)
{
res++;
s[j] = '0';
}
}
}
}
}
cout << res << endl;
}
int main()
{
solve();
}
如果觉得有用还请点个赞吧,拜托拜托