题目传送门
看到各位大佬都在发题解,我也来水一篇。
关于这道题,我们首先要理解一下题目……
该子序列可以通过删除掉变换后的 s 中的某些字母得到。
从这句话中可以知道,变换后的字符串 s 只需要包含 a∼z 即可,并不需要为连续子序列。
我们可以定义一个字符变量,初始值为 a,代表进度(下一个满足要求的 si 会变换成进度)。然后遍历一遍字符串 s,如果 si 小于进度,说明满足要求,可以转变,记得进度也要增加,其他的则不能。而如果当前进度已经大于 z,说明字符串 s 已经包含 a∼z,那么此时可以直接跳出循环。
最后我们判断一下,如果进度小于等于 z,证明并没有跳出循环,字符串 s 不满足要求,输出 -1
。否则,代表字符串 s 满足要求,直接输出 s 即可。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <bits/stdc++.h> #define int long long using namespace std; string s; char c = 'a'; signed main() { ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> s; for (int i = 0; i < s.size(); i++) { if (c > 'z') break; if (s[i] <= c) { s[i] = c; c++; } } if (c <= 'z') cout << -1; else cout << s; return 0; }
|