這題考察的是簡單的字符串操做。
評測的約定變量的格式很嚴格,輸入保證模板中全部以 {{ 開始的子串都是合法的標記,開始是兩個左大括號和一個空格,而後是變量名,結尾是一個空格和兩個右大括號。所以不須要考慮各類不一樣的書寫狀況,什麼沒有空格,有多個空格的狀況。用字符串搜索肯定{{的位置,和}}的位置,就能夠定位變量的名稱。
輸入雖然有多行,可是存儲和處理的時候徹底沒有必要,分行處理,存儲在一個字符串裏就能夠了,處理的時候也會簡單不少。
存儲變量的值能夠用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; }