Gym - 101190A Abbreviation(string字符串 模拟)

题目链接:点击打开链接

题目大意:就是给你几行字符串,将某些连续的单词缩写,连续缩写的的单词有以下几个要求:

1.单词需要第一位大写,后几位均为小写。

2.需要至少两个符合条件的单词才可以缩写

3.两个符合的单词之间只能隔一个空格。如果隔了两个及两个以上空格或者标点符号的话,均不满足.

题目思路:

此题强烈建议用string来做,因为string可以一位一位的判断,直接相加。用char读入的话超级麻烦,不建议用char。

用string a存储单词,string b存储空格符号,用string flag存储单词首字母(如果这个单词符合条件的话),最后将flag内的缩写处理后加入到b中,最后逐一输出a和b即可.

#include <bits/stdc++.h>
using namespace std;
string s ,a[150],b[150],flag[150];
bool judge(int pos)
{
    if(a[pos].size()<=1) return false;
    if(a[pos][0]>='a' && a[pos][0] <='z') return false;
    for(int i=1;i<a[pos].size();++i)
    {
        if( a[pos][i]>='A' && a[pos][i] <='Z') return false;
    }
    return true;
}
int main()
{
    freopen("abbreviation.in","r",stdin);
    freopen("abbreviation.out","w",stdout);
    while(getline(cin,s))
    {
        int ida=0 , idb=0;
        b[0]="";
        for(int i=0;i<s.size();)
		//a记录单词  b记录间隔符号和空格
        {
            a[++ida]="";
            for( ;i<s.size();++i)
            {
                if(isalpha(s[i]))   a[ida]+=s[i];
                else break;
            }
            b[++idb]="";
            for( ; i<s.size();++i)
            {
                if(!isalpha(s[i])) b[idb]+=s[i];
                else break;
            }
        }
        b[idb+1]="";

        for(int i=1;i<=ida;++i)
        {
        	//如果a单词符合缩写的话 flag存a[i]的第一个字母
            if(judge(i)) flag[i]=a[i][0];
            else flag[i]="";
        }

        for(int i=1;i<=ida;)
        {
            if(flag[i]!="")
            {
                string temp = flag[i];//存缩写
                for(int j=i+1;j<=ida;++j)
                {
                    if(b[j-1]==" " && flag[j] !="")
                    {
                        temp+=flag[j];
                    }
                    else
                    {
                        if(temp.size()>=2)//缩写放b中
                        {
                            b[i-1] +=temp+" (";
                            b[j-1] =")"+b[j-1];
                        }
                        i=j;
                        temp="";
                        break;
                    }
                }
                if(temp!="")
                {
                    if(temp.size()>=2)
                    {
                        b[i-1] +=temp+" (";
                        b[ida] =")"+b[ida];
                    }
                    i=ida+1;
                    temp="";
                }
            }
            else ++i;
        }
        if(b[0]!="") cout<<b[0];
        for(int i=1;i<ida;++i)
        {
            cout<<a[i]<<b[i];
        }
        if(b[ida]=="") cout<<a[ida]<<endl;
        else cout<<a[ida]<<b[ida]<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值