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