L1-064 估值一亿的AI核心代码

题目链接

一道简单模拟题,比较考验对一些方法的运用,如果不能很好得运用造好的“轮子”实际在比赛中会很耗时间,得不偿失!
1、建议建立映射关系,方便查找替换
2、使用STL容器中“string”类型的replace成员函数
3、功能单一且调用频繁的部分用子函数代替

#include
#include
#include
using namespace std;
bool is(char ch) {			//判断是否为符号
	if (ch >= 'A' && ch <= 'Z')	return false;
	if (ch >= 'a' && ch <= 'z')	return false;
	if (ch >= '0' && ch <= '9')	return false;
	return true;
}
bool ok(string s,int len, int pos) {		//判断该单词是否独立
	if (pos > 0) {
		if (is(s[pos - 1]) && is(s[pos + len]))
			return true;
	}
	else if (is(s[pos + len]))	return true;
		
	return false;
}
int main() {
	int N;
	string s1, s2;
	string M[4][2] = {			//建立映射关系,可以有效减少代码量
		{"can you","& can"},{"could you","& could"},{"I","you"},{"me","you"}		
	};
	cin >> N;
	cin.get();
	while (N--) {
		getline(cin, s1);
		s2 = s1;
		while (s2[0] == ' ') s2.erase(s2.begin());			//删除行首、行尾空格
		while (s2[s2.size() - 1] == ' ') s2.erase(s2.end()-1);		
		for (int i = 0; i < s2.size(); i++) {			//删除单词间和符号间多余空格
			if (s2[i] == ' ') {
				while (s2[i + 1] == ' ') s2.erase(i + 1, 1);
				if (is(s2[i + 1])) {
					s2.erase(i, 1);
					i--;
				}
			}
		}
		for (int i = 0; i < s2.size(); i++) {				//替换大写和问号
			if (s2[i] >= 'A' && s2[i] <= 'Z' && s2[i] != 'I')	s2[i] = s2[i] - 'A' + 'a';
			if (s2[i] == '?')	s2[i] = '!';
		}

		for (int i = 0; i < s2.size(); i++) {//替换部分单词,注意could I 和 can I中的“I”不应该被后续替换为“you”
			for (int j = 0; j < 4; j++) {
				if (s2.substr(i, M[j][0].size()) == M[j][0] && ok(s2, M[j][0].size(), i))	s2.replace(i, M[j][0].size(), M[j][1]);
			}
		}
		for (int i = 0; i < s2.size(); i++) {
			if (s2[i] == '&')	s2[i] = 'I';
		}
		cout << s1 << endl;
		cout << "AI: " << s2 << endl;
	}
	return 0;
}

你可能感兴趣的:(PTA,算法,c++,开发语言)