मान लीजिए हमारे पास एक स्ट्रिंग है; हमें एक HTML पार्सर डिज़ाइन करना है जो HTML सिंटैक्स के विशेष कैरेक्टर को सामान्य कैरेक्टर में बदल देगा। HTML एंटिटी पार्सर वह पार्सर है जो HTML कोड को इनपुट के रूप में लेता है और विशेष कैरेक्टर्स की सभी एंटिटी को कैरेक्टर स्वयं से बदल देता है। ये HTML के लिए विशेष कैरेक्टर और उनकी एंटिटी हैं:
कोटेशन मार्क - एंटिटी है " और सिंबल कैरेक्टर है "।
सिंगल कोट मार्क - एंटिटी है ' और सिंबल कैरेक्टर है '।
एम्परसैंड - एंटिटी है & और सिंबल कैरेक्टर है &।
ग्रेटर दैन साइन - एंटिटी है > और सिंबल कैरेक्टर है >।
लेस दैन साइन - एंटिटी है < और सिंबल कैरेक्टर है <।
स्लैश - एंटिटी है ⁄ और सिंबल कैरेक्टर है /।
इसलिए, यदि इनपुट है "& is changed but &ambassador; is not.", तो आउटपुट होगा "& is changed but &ambassador; is not."
इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे:
एक ऐरे v = स्पेस का उपयोग करके स्ट्रिंग को विभाजित करके इनिशियलाइज़ करें
ret := खाली स्ट्रिंग
एक मैप m परिभाषित करें, जो सभी HTML सिंबल को कुंजी और संबंधित विशेष कैरेक्टर को मान के रूप में रखेगा
i := 0 से शुरू करें, जब i < v का आकार, i बढ़ाते हुए, करें -
s := v[i]
temp := खाली स्ट्रिंग
n := v[i] का आकार
k := 0
जब k < n, करें -
यदि v[i, k], '&' के समान है, तो -
temp := temp + v[i, k]
(k को 1 से बढ़ाएं)
जब (k < n और v[i, k], ';' के बराबर नहीं है), करें -
temp := temp + v[i, k]
(k को 1 से बढ़ाएं)
temp := temp + v[i, k]
(k को 1 से बढ़ाएं)
यदि temp, m का सदस्य है, तो -
ret := ret + m[temp]
अन्यथा
ret := ret + temp
temp := खाली स्ट्रिंग
अन्यथा
ret := ret + v[i, k]
(k को 1 से बढ़ाएं)
यदि temp का आकार 0 नहीं है और temp, m का सदस्य है, तो -
ret := ret + m[temp]
अन्यथा जब temp का आकार, तो -
ret := ret + temp
यदि i, v के आकार के बराबर नहीं है, तो -
ret := ret + खाली स्थान
ret लौटाएं
उदाहरण
बेहतर समझ के लिए निम्न कार्यान्वयन देखें:
#include <bits/stdc++.h> using namespace std; class Solution { public: vector <string> split(string& s, char delimiter){ vector <string> tokens; string token; istringstream tokenStream(s); while(getline(tokenStream, token, delimiter)){ tokens.push_back(token); } return tokens; } void out(vector <string> v){ for(string s : v) cout << s << endl; } string entityParser(string text) { vector<string> v = split(text, ' '); string ret = ""; map<string, string> m; m["""] = "\""; m["'"] = "'"; m["&"] = "&"; m[">"] = ">"; m["<"] = "<"; m["⁄"] = "/"; for (int i = 0; i < v.size(); i++) { string s = v[i]; string temp = ""; int n = v[i].size(); int k = 0; while (k < n) { if (v[i][k] == '&') { temp += v[i][k]; k++; while (k < n && v[i][k] != ';') { temp += v[i][k]; k++; } temp += v[i][k]; k++; if (m.count(temp)) ret += m[temp]; else ret += temp; temp = ""; } else { ret += v[i][k]; k++; } } if (temp.size() && m.count(temp)) { ret += m[temp]; } else if (temp.size()) ret += temp; if (i != v.size() - 1) ret += " "; } return ret; } }; main(){ Solution ob; cout << (ob.entityParser("& is changed but &ambassador; is not.")); }इनपुट
"& is changed but &ambassador; is not."
आउटपुट
& is changed but &ambassador; is not.