测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27723. 字符串改造(trans.cpp)问题描述小明有一个字符串,由小写英文字母组成。小明准备对他的字符串进行改造,改造的方法是删除字符串中间的一部分字符。小明希望改造完后,新的字符串中的相邻字符都满足左边的字符小于等于右边的字符(a < b < … < z)。 例如,对于字符串 happy,小明可以删除第一个字母,变成 appy,满足要求。或者小明删除第二字母,变成 hppy,也满足要求。小明还有其他…

填空题 中等

题目描述

字符串改造(trans.cpp)

问题描述

小明有一个字符串,由小写英文字母组成。

小明准备对他的字符串进行改造,改造的方法是删除字符串中间的一部分字符。

小明希望改造完后,新的字符串中的相邻字符都满足左边的字符小于等于右边的字符(a < b < … < z)。  

例如,对于字符串 happy,小明可以删除第一个字母,变成 appy,满足要求。或者小明删除第二字母,变成 hppy,也满足要求。小明还有其他方法使得结果满足要求。

再如,对于字符串 autumn,可以删除 3 个字母变成 tmn,或者删除 4 个字母变成 at。

其他满足要求的方案还有很多。

小明想知道,对于一个字符串,至少要删除多少个字母能满足要求。

输入格式

从文件 trans.in 中输入数据。

输入一行包含一个字符串。

输出格式

输出到文件 trans.out 中。

输出一行,包含一个整数,表示最少要删除的字母个数。

样例输入

happy

样例输出

1

样例输入

autumn

样例输出

3

评测用例规模与约定

注意:以下规模是评测时输入数据一定会满足的限制,在你的程序中不需要对这些限制进行检查。

对于 30%的评测用例,字符串的长度不超过 20;

对于 60%的评测用例,字符串的长度不超过 1000;

对于 80%的评测用例,字符串的长度不超过 10000;

对于所有评测用例,字符串的长度不超过 100000。

参考答案

#include <cstdio> #include <iostream> #include <string> using namespace std; int len[30] = {}; int main() { freopen("trans.in", "r", stdin); freopen("trans.out", "w", stdout); string s; cin >> s; int siz = s.size(); for (int i = 0; i < siz; i++) { for (int j = s[i] - 'a'; j >= 0; j--) { len[s[i] - 'a'] = max(len[s[i] - 'a'], len[j] + 1); } } int mx = 0; for (int i = 0; i < 26; i++) { mx = max(mx, len[i]); } cout << siz - mx << endl; return 0; }
上一题 下一题