[2016 微软预科生计划-探星夏令营在线测试2] Give My Text Back(字符串处理)

描述

To prepare for the English exam Little Ho collected many digital reading materials. Unfortunately the materials are messed up by a malware.

It is known that the original text contains only English letters (a-zA-Z), spaces, commas, periods and newlines, conforming to the following format:

1. Each sentence contains at least one word, begins with a letter and ends with a period.

2. In a sentence the only capitalized letter is the first letter.

3. In a sentence the words are separated by a single space or a comma and a space.

4. The sentences are separated by a single space or a single newline.

It is also known the malware changes the text in the following ways:

1. Changing the cases of letters.

2. Adding spaces between words and punctuations.

Given the messed text, can you help Little Ho restore the original text?

输入

A string containing no more than 8192 English letters (a-zA-Z), spaces, commas, periods and newlines which is the messed text.

输出

The original text.

样例输入
my Name  is Little   Hi.
His   name IS Little ho  ,  We are   friends.
样例输出
My name is little hi.
His name is little ho, we are friends.

题解:单词提取,字符串简单处理。注意一些细节:每句话第一单词第一字符大写,空格等问题。

#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<set>
#include<sstream>
#include<cstdio>
#include<unordered_map>
#include<unordered_set>
#include<cmath>
#include<climits>
#include<stack>
#include<queue>
using namespace std;
bool is_c(char c) {
   if(c>='a'&&c<='z'||c>='A'&&c<='Z') return true;
   return false;
}
int main() {
    string s;
    while(getline(cin,s)!=NULL) {
        int len=s.size();
        string res="";
        for(int i=0;i<len;i++) {
            if(s[i]>='A'&&s[i]<='Z') {
                s[i]+=32;
            }
        }
        int start=0;
        bool isCap=true;
        while(true) {
            while(start<len) {
                if(s[start]==','||s[start]=='.') {
                    res+=s[start];
                    if(s[start]=='.') {
                        isCap=true;
                    }
                }
                else if(is_c(s[start])) break;
                start++;
            }
            if(start>=len) break;
            string num="";
            for(int i=start;i<len;i++) {
                if(s[i]==' ') {
                   num=s.substr(start,i-start);
                   start=i+1;
                   break;
                }
                else if(s[i]==','||s[i]=='.') {
                   num=s.substr(start,i-start+1);
                   start=i+1;
                   break;
                }
            }
            if(num.size()==0) {
                break;
            }
            else {
                if(isCap) {
                    num[0]-=32;
                    isCap=false;
                }
                if(res.size()==0) {
                    res+=num;
                }
                else res+=" "+num;
                if(num[num.size()-1]=='.') {
                    isCap=true;
                }
            }
        }
        cout<<res<<endl;
    }
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值