赞
踩
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:
I
;can you
、could you
对应地换成 I can
、I could
—— 这里“独立”是指被空格或标点符号分隔开的单词;I
和 me
换成 you
;?
换成惊叹号 !
;输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
按题面要求输出,每个 AI 的回答前要加上 AI:
和一个空格。
- 6
- Hello ?
- Good to chat with you
- can you speak Chinese?
- Really?
- Could you show me 5
- What Is this prime? I,don 't know
- Hello ?
- AI: hello!
- Good to chat with you
- AI: good to chat with you
- can you speak Chinese?
- AI: I can speak chinese!
- Really?
- AI: really!
- Could you show me 5
- AI: I could show you 5
- What Is this prime? I,don 't know
- AI: what Is this prime! you,don't know
注:要求三、四中什么叫独立 举例:can you abc 独立 can youabc 不独立
预处理:先将单词间保留1 个空格(为第三步做准备) 接着再将字符串头尾各插入一个空格。
这样的预处理完成后,字符串的所有单词将变成独立的(即使是符号也成独立的了),并且所有单词间都是一个空格。
第一步:完成要求二:大写变小写 (除I)
第二步:完成要求五:? ——> !
第三步:完成要求三和要求四
/*3.1 思路
先can/could you ———> A can/could(为什么要先变成A?因为如果直接变成I 要求四中I又会变成you了)
再完成I/me ———> you后
最后将A ——>I
*/
第四步:完成要求一:消除多余空格(首尾删除多余空格,单词间只需要一个空格,标点符号前后空格)
总结:完成这个题目的关键点在于如何去完成这些要求,又因为这些要求间有相互有些影响,所有完成要求的顺序就尤为重要。
- 1
- can me
正确:can空格you
,abc
正确:,abc(原样输出)
- #include<bits/stdc++.h>
- using namespace std;
- int main(){
- int n;
- string s;
- cin >> n;
- getchar();
- while(n--){
- getline(cin, s);
- cout << s << endl << "AI: ";
- //准备工作
- //单词间保留一个空格
- for(int i = 0; i < s.size(); i ++){
- if(s[i]==' '){
- while(s[i+1]==' ') s.erase(i+1,1);
- }
- }
- // 字符串头尾各加一个空格
- s = " " + s + " ";
- // 非数字、空格、字母前后分别加一个空格(符号前后)
- for(int i = 0; i < s.size(); i++){
- if(!(s[i]>='0'&&s[i]<='9')&&s[i] != ' ' && (s[i]<'A'||(s[i]>'Z'&&s[i]<'a')||s[i]>'z')){
- s.insert(i," ");
- s.insert(i+2," ");
- i+=2;
- }
- }
- //1 完成要求二:大写变小写 (除I)
- for(int i = 0; i < s.size(); i++)
- if(s[i] >= 'A' && s[i] <= 'Z' && s[i] != 'I')
- s[i] = s[i] - 'A' + 'a';
- //2 完成要求五:? ————> !
- for(int i = 0; i < s.size(); i++)
- if(s[i] == '?') s[i] = '!';
- //3 完成要求三和要求四
- /*3.1 思路
- 先can/could you ———> A can/could
- 再完成I/me ———> you后
- 最后将A ——>I
- */
- //can you ———> A can (先不变成I)
- while(s.find(" can you ")!=-1)
- s = s.replace(s.find(" can you "),9," A can ");
- //could you ———> A could (先不变成I)
- while(s.find(" could you ")!=-1)
- s = s.replace(s.find(" could you "),11," A could ");
- //I ———> you
- while(s.find(" I ")!=-1)
- s = s.replace(s.find(" I "),3," you ");
- //me ———> you
- while(s.find(" me ")!=-1)
- s = s.replace(s.find(" me "),4," you ");
- //A ———> I
- while(s.find(" A ")!=-1)
- s = s.replace(s.find(" A "),3," I ");
- //4 完成要求一:消除多余空格(首尾删除多余空格,单词间只需要一个空格,标点符号前后空格)
- //删除开头空格
- while(s[0] == ' ') s.erase(0,1);
- //删除结尾空格
- while(s[s.size()-1] == ' ') s.erase(s.size()-1,1);
- //删除标点符号前后空格
- for(int i = 0; i < s.size(); i ++){
- if(!(s[i]>='0'&&s[i]<='9')&&s[i] != ' ' && (s[i]<'A'||(s[i]>'Z'&&s[i]<'a')||s[i]>'z')){
- if(i == 0 ) s.erase(i+1,1);//符号在开头, 删除后面一个空格
- else{//符号不在开头
- s.erase(i-1,1);
- s.erase(i,1);
- }
- }
- }
- for(int i = 0; i < s.size(); i ++){
- if(!(s[i]>='0'&&s[i]<='9')&&s[i] != ' ' && (s[i]<'A'||(s[i]>'Z'&&s[i]<'a')||s[i]>'z')){
- if(s[i-1]==' ')s.erase(i-1,1);
- }
- }
- cout << s << endl;
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。