P1098 字符串展开

题目描述

在输入的字符串中,用连续递增的字母获数字串替代其中的减号。
(1)出现了减号“-”,减号两侧同为小写字母或数字,且按照ASCII码的顺序,减号右边的字符大于左边的字符。
(2) p1=1时,填充小写字母;p1=2时,填充大写字母。p1=3时,填充的字母个数相同的星号“*”。
(3) p2=k表示同一个字符要连续填充k个。
(4) p3=1表示维持原来顺序,p3=2表示采用逆序输出。
(5) 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号。

样例输入

1 2 1
abcs-w1234-9s-4zz

样例输出

abcsttuuvvw1234556677889s-4zz

思路

O(n)
模拟,判断每种情况,按题意模拟。
var
  a,b,c:longint;
  s:string;
procedure main(p:longint);
var
  i,j:longint;
begin
  if s[p+1]<=s[p-1] then write('-')
  else
    if c=1 then
      for i:=(ord(s[p-1])+1) to (ord(s[p+1])-1) do
        for j:=1 to b do
          if a=3 then write('*')
        else
          if (s[p-1]>='a')and(s[p-1]<='z')and(a=2) then
            write(upcase(chr(i)))
        else
            write(chr(i))
  else
    for i:=(ord(s[p+1])-1) downto (ord(s[p-1])+1) do
      for j:=1 to b do
        if a=3 then write('*')
      else
        if (s[p-1]>='a')and(s[p-1]<='z')and(a=2) then
          write(upcase(chr(i)))
      else
        write(chr(i));
end;
var
  i:longint;
begin
  readln(a,b,c);
  readln(s);
  write(s[1]);
  for i:=2 to length(s)-1 do
    if s[i]<>'-' then write(s[i])
  else
    if ((s[i-1]>='0')and(s[i-1]<='9')and(s[i+1]>='0')and(s[i+1]<='9'))or((s[i-1]>='a')and(s[i-1]<='z')and(s[i+1]<='a')and(s[i+1]>='z')) then main(i)
  else
    write(s[i]);
  writeln(s[length(s)]);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值