这题考察的是简单的字符串操做。
评测的约定变量的格式很严格,输入保证模板中全部以 {{ 开始的子串都是合法的标记,开始是两个左大括号和一个空格,而后是变量名,结尾是一个空格和两个右大括号。所以不须要考虑各类不一样的书写状况,什么没有空格,有多个空格的状况。用字符串搜索肯定{{的位置,和}}的位置,就能够定位变量的名称。
输入虽然有多行,可是存储和处理的时候彻底没有必要,分行处理,存储在一个字符串里就能够了,处理的时候也会简单不少。
存储变量的值能够用map,测试的系统不支持C++11,因此不能用unordered_map。
这是一道很好的题目,曾经编写网站后端的时候,就有用过Python里的模板引擎jinja,但没有一点想法它是怎么实现的。题目里虽然只要求实现最简单的变量替换,但倒是让咱们去思考那个黑盒子。html
#include "map" #include "iostream" #include "string" using namespace std; int main() { int lineNum, varNum; cin >> lineNum >> varNum; string inputStr, outputStr, tempStr; map<string, string> varDict; getchar(); // consume next new line character for(int i=0; i<lineNum; i++) { getline(cin, tempStr); inputStr += tempStr + '\n'; } //cout << inputStr; string varKey, varValue; for(int i=0; i<varNum; i++) { cin >> varKey; getline(cin, tempStr); int startQuote = tempStr.find("\""); int endQuote = tempStr.rfind("\""); varValue = tempStr.substr(startQuote+1, endQuote-startQuote-1); //cout << value; varDict[varKey] = varValue; } int startPos, endPos; // startPos->{{ endPos->}} int startPoint = 0; // start position for string.find while(true) { startPos = inputStr.find("{{", startPoint); endPos = inputStr.find("}}", startPos); if(startPos<0 || endPos <0) break; varKey = inputStr.substr(startPos+3, endPos-startPos-4); varValue = ""; if(varDict.find(varKey) != varDict.end()) varValue = varDict[varKey]; outputStr += inputStr.substr(startPoint, startPos-startPoint) + varValue; startPoint = endPos + 2; } outputStr += inputStr.substr(startPoint, inputStr.length()); cout << outputStr; }