本题按下标从小到大处理字符,但判定规则用的是“原串的前一个字符的大小写”,不是已经修改后的。 因此做法非常直接:
读取原串 s
,用它来只判断大小写;同时用一个可变结果容器(如 StringBuilder
/ 新串)来写入答案。
定义两个小函数:
flip(c)
:大小写翻转(a↔A
)。nextSameCase(c)
:在同大小写内的下一个字母并循环(z→a
,Z→A
)。给定一个长度为 n 的字符串 s (下标从 1 开始),字符串仅由大小写字母组成。对 s 进行一次完美操作,按下标从小到大依次处理每个字符 si ,规则如下:
若 i=1 ,将 s1 转换为其对应的大小写(小写变大写,大写变小写);
若 i≥2 ,比较 si 与 si−1 (注意:这里的 si−1 指的是修改前的 si−1 ) 的大小写,若一个为大写、另一个为小写(大小写不同),将 si 替换为其对应的大小写;否则,将 si 替换为字母表中的下一个同大小写的字母。特别地:′z′→′a′,′Z′→′A′ 。
第一行输入一个整数 n(1≦n≦2×105) ,表示字符串的长度。
第二行输入一个长度为 n 的字符串 s ,仅由大小写字母组成。
在一行上输出一个长度为 n 的字符串,表示对 s 执行完美操作后的结果。
输入
5
aAbZz
输出
AaBzZ
说明
解释:
i=1:大小写变换,′a′→′A′ ;
i=2:s2=′A′ 与 s1=′a′ 大小写不同,变换为 ′a′ ;
i=3:s3=′b′ 与 s2=′A′ 大小写不同,变换为 ′B′ ;
i=4:s4=′Z′ 与 s3=′b′ 大小写不同,变换为 ′z′ ;
i=5:s5=′z′ 与 s4=′Z′ 大小写不同,变换为 ′Z′ ;
输入
5
aaazZ
输出
Abbaz