PTA 题目 L1-064 估值一亿的AI核心代码 (20分)
原题描述见官网 题目
原作者的代码没有贴注释,没有学过正则表达式的可能看起来比较吃力,可以找教程学习下 正则表达式 ,下图贴出的代码加了注释我就不再重复解释了,这种解法是比较快的
网上另外的解法其实其本质也还是字符匹配,实现过程也是比较复杂
#include <bits/stdc++.h>
#include <regex>
using namespace std;
int main() {
int n;
scanf("%d", &n);
getchar();
while(n--) {
string s;
getline(cin, s);
cout << s << endl;
//1.regex_replace
//R"(\s+)"等价于 [ \f(换页符) \n(换行符) \r(回车符)\t(制表符) \v(垂直制表符)],
//+代表可以多个相连的时候组合一起替换,注意 Unicode 正则表达式会匹配全角空格符。
//匹配所有匹配任何空白字符,包括空格、制表符、换页符等等。
s = regex_replace(s, regex(R"(\s+)"), " ");//第一步将多个连续空格变成一个空格
if(s.front() == ' ') s.erase(s.begin());
if(s.back() == ' ') s.pop_back();//第二步删除首尾的空格
//2.regex_replace
//R"( !)")将 "空格+!" 替换为 "!"
//R"( \.)" "."前面的 "\"代表转义,原来的"."的代表匹配除换行符"\n"之外的任何单字符
//第三步将标点符号前的空格删除
s = regex_replace(s, regex(R"( !)"), "!");//原作者的代码里有这个,测试用例没有对应的,好像不需要这行
s = regex_replace(s, regex(R"( ,)"), ","); //原作者的代码里有这个,测试用例没有对应的,好像不需要这行
//s = regex_replace(s, regex(R"(.)"), ".");//将除\n的单字符都替换为.,在输入密码时可以使用
s = regex_replace(s, regex(R"( \.)"), ".");
s = regex_replace(s, regex(R"( \?)"), "?");
s = regex_replace(s, regex(R"( ')"), "'");
for (auto &c : s) {
if(c != 'I') c = tolower(c);
}//第四步将字母全部变为小写
//定位符用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束
//\b 描述单词的前或后边界,\B 表示非单词边界。
//R"(\bcan you\b)"表示匹配"can you"字符串,这里在"I"前面增加"_"的原因是与后面的I区分
//注意R"(\bI\b)")(只有单独字符完全匹配(前后都是空格))和R"(I)")(直接替换)的区别
s = regex_replace(s, regex(R"(\bcan you\b)"), "_I can");
s = regex_replace(s, regex(R"(\bcould you\b)"), "_I could");
s = regex_replace(s, regex(R"(\bI\b)"), "you");
s = regex_replace(s, regex(R"(\bme\b)"), "you");
s = regex_replace(s, regex(R"(\?)"), "!");
s = regex_replace(s, regex(R"(\b_I\b)"), "I");
cout << "AI: " << s << endl;
}
//system("pause");
}
转载于 https://blog.csdn.net/weixin_30352645/article/details/95272515