先说感受:这道题其实并不难,就是麻烦,处理了老长时间最后只得了70分,服了,也不知道哪没考虑到。
解题思路:
我用的是c++11的正则表达式来做的,先对没一行进行分析,找出要替换的地方,接着在进行处理,在处理最后几行输入时,我用的将其拆分放入一个map中,这样在填的时候就知道哪个没有,比如样例中address就没有需要对其进行填空("")处理,可直接使用map.insert(make_pair())处理。
测试代码
#include<iostream>
#include<stdlib.h>
#include<regex>
#include<vector>
#include<string>
#include<iterator>
#include<map>
using namespace std;
typedef vector<string> vec_str;
map<string, string> con;
int isnot_exist(string str) {
for (auto ss : con) {
if (ss.first == str) {
return 0;
}
}
return 1;
}
string cope_str(string str) {
string str_final;
for (string::iterator i = str.begin(); i != str.end(); ++i) {
if (*i >= 'a'&&*i <= 'z') {
str_final += *i;
}
}
return str_final;
}
void cope_condit(vector<string> vec) {
string key, value;
for (vector<string>::iterator it = begin(vec); it != end(vec); ++it) {
for (string::iterator it_ = it->begin(); it_ != it->end(); ++it_) {
if (*it_ != '\"') {
key += *it_;
}
else {
while (it_ != it->end()) {
if (*it_ != '\"') {
value += *it_;
}
it_++;
}
break;
}
}
key.resize(key.size() - 1);
con.insert(make_pair(key, value));
key.clear();
value.clear();
}
}
int main() {
vec_str model;//存储模板
vec_str condit;//存储条件
smatch result;
regex ref{ "[{]+ [a-z]* [}]+"};//匹配花括号时需要将其放到方括号中
int num1, num2;
cin >> num1 >> num2;
//模板输入
for (int i = 0; i < num1 + num2 + 1; ++i) {//使用getline,要处理第一个空
string temp;
getline(cin, temp);
model.push_back(temp);
}
//处理第一个空
for (int i = 1; i < model.size(); ++i) {
model.at(i - 1) = model.at(i);
}
model.resize(model.size()-1);
for (int i = num1; i < model.size(); ++i) {
condit.push_back(model.at(i));
}
model.resize(model.size() - num2);
//将condit处理为map,存入map<string,string> con;
cope_condit(condit);
#if 0
con.insert(make_pair("name", "wangxiaoning"));
con.insert(make_pair("email", "bsbs@qq.com"));
#endif
for (int i = 0; i < model.size();++i) {
string str = model.at(i);
string sub_str;
if (regex_search(str, ref)) {//搜索其中是否含有目标
string::const_iterator itB = str.begin();
string::const_iterator itE = str.end();
while (regex_search(itB, itE, result, ref)) {
string tmp = result[0];
string s = cope_str(tmp);
if (isnot_exist(s)) {
con.insert(make_pair(s, ""));
}
for (map<string, string>::iterator mr = begin(con); mr != end(con); ++mr) {
if (tmp.find(mr->first)!=string::npos) {//在Map中找到相应的。就将其替换
for (string::const_iterator mn = itB; mn < result[0].second - tmp.size(); ++mn) {
sub_str += *mn;
}
sub_str += mr->second;
break;
}
}
itB = result[0].second;
}
for (string::const_iterator mn = itB; mn != itE; ++mn) {
sub_str += *mn;
}
model.at(i) = sub_str;
}
}
for (auto str : model) {
cout << str << endl;
}
return 0;
}
//
for(auto m:targ)//这样遍历不可修改遍历内容
自己尽力了,拿不到满分。欢迎指正交流,一起进步。
修正:仔细读了var变量的要求进一步改进得分80分:方法“修改正则匹配原则为regex ref{"[{]+ [a-zA-Z_]{1}[a-zA-Z0-9_]* [}]+"}”,意思为匹配var不以数字开头,并有大小写字母数字下划线组成成的变量。