轉載 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

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