转载 PTA 题目 L1-064 估值一亿的AI核心代码 (20分)

 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章