SDUTOJ 1916 - 字符串扩展

Problem Description

Tom有些时候为了记录的方便,常常将一些连续的字符用扩展符’-‘简单表示。比如abcdefg可以简写为a-g,即用起始的字符和终止字符中间加上一个扩展符’-‘来表示这个字符串。但是为了处理的方便,Tom又必须将这些我们简单记法扩展成原来的字符串。很明显要是人工来做的话必定很麻烦,Tom知道计算机可以帮助他完成这个任务,但是他却不会编程,这的确让他很上火。他知道今天是山东理工大学第三届ACM校赛的日子,届时来自全校的编程爱好者都会来参加比赛,他很兴奋,因为这个困惑他良久的问题终于要被解决了。给你一个含有扩展符’-'的字符串,你的任务就是将他还原成原来的字符串。要求是只处理[a-z]、[A-Z]、[0-9]范围内的字符扩展,即只有当扩展符前后的字符同时是小写字母、大写字母或数字时并且扩展符前面的字符不大于后面的字符才进行扩展,其它情况不进行扩展,原样输出。例如:a-R、D-e、0-b、4-B等字符串都不进行扩展。

Input

第一行是一个正整数T,表示共有T组测试数据(T < 100)。下面的T行,每一行包括一个长度不大于1000的待扩展字符串.

Output

每组测试数据输出一行扩展后的字符串。

Sample Input

3
ADEa-g-m02
acm-0-5-a-ac-cm-m-A-AC-CM-M
Welcometothe3rdACM/ICPCCampusProgrammingContestofSDUT-1-3-A-z-a-Z

Sample Output

ADEabcdefghijklm02
acm-012345-aaccmm-AACCMM
Welcometothe3rdACM/ICPCCampusProgrammingContestofSDUT-123-A-z-a-Z

Hint
Source

山东理工大学第三届ACM程序设计竞赛

思路:
对字符串进行遍历
若碰到符合条件的可扩展字符,则在新建的StringBuffer对象的基础上进行扩展
若没有碰到符合条件的可扩展字符,则直接追加到StringBuffer对象的末尾

注意:
进行操作的必须是StringBuffer类的对象,若使用String类的对象,则每一次对String类对象进行操作都会产生新的对象,从而造成超时或内存溢出

package cn.edu.sdut.acm;

import java.util.*;
import java.lang.StringBuffer;

public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while (t > 0) {
            t--;
            String str = sc.next();
            StringBuffer result = new StringBuffer("");

            for (int i = 0; i < str.length(); i++){ // 遍历字符串
                if (str.charAt(i) == '-'&&i!=0&&i!=str.length()-1){ // 若在字符串中间找到扩展符
                    if (str.charAt(i-1) <= str.charAt(i+1)
                        &&((str.charAt(i-1)>='0'&&str.charAt(i+1)<='9')
                        ||(str.charAt(i-1)>='a'&&str.charAt(i+1)<='z')
                        ||(str.charAt(i-1)>='A'&&str.charAt(i+1)<='Z'))){ // 若该扩展符符合条件(因为若扩展符两边的字符若相同则去掉扩展符,所以是<=)
                        for(int j = str.charAt(i-1)+1; j < str.charAt(i+1); j++){ // 在StringBuffer类对象后追加扩展的字符
                            result.append((char)j);
                        }
                    }
                    else{ // 若该扩展符不符合条件,当做普通字符追加末尾
                        result.append("-");
                    }
                }
                else{ // 普通字符追加末尾
                    result.append(str.charAt(i));
                }
            }
            System.out.println(result);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值