赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。