题目链接:点击打开链接
题目大意:就是给你几行字符串,将某些连续的单词缩写,连续缩写的的单词有以下几个要求:
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;
}