मान लीजिए हमारे पास एक स्ट्रिंग है; हमें एक HTML पार्सर डिज़ाइन करना होगा जो HTML सिंटैक्स के विशेष वर्ण को सामान्य वर्ण में बदल देगा। HTML इकाई पार्सर वह पार्सर है जो HTML कोड को इनपुट के रूप में लेता है और विशेष वर्णों की सभी संस्थाओं को वर्णों से ही बदल देता है। ये HTML के लिए विशेष वर्ण और उनकी इकाइयाँ हैं -
-
कोटेशन मार्क - एंटिटी "है और सिंबल कैरेक्टर" है।
-
सिंगल कोट मार्क - एंटिटी 'है और सिंबल कैरेक्टर' है।
-
एम्परसेंड - एंटिटी &है और सिंबल कैरेक्टर &है।
-
साइन से बड़ा - इकाई> है और प्रतीक वर्ण> है।
-
संकेत से कम - इकाई <है और प्रतीक वर्ण <.
. है -
स्लैश - इकाई ⁄ है और प्रतीक वर्ण / है।
इसलिए, यदि इनपुट "और बदल गया है लेकिन &राजदूत; नहीं है" जैसा है, तो आउटपुट "और बदल दिया जाएगा लेकिन &राजदूत; नहीं है।"
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक सरणी परिभाषित करें v =स्पेस का उपयोग करके स्ट्रिंग को विभाजित करके v प्रारंभ करें
-
रिट:=खाली स्ट्रिंग
-
एक मानचित्र m को परिभाषित करें, यह सभी HTML प्रतीकों को कुंजी के रूप में और संबंधित विशेष वर्ण को मान के रूप में रखेगा
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
एस:=वी[i]
-
अस्थायी:=खाली स्ट्रिंग
-
n :=v का आकार[i]
-
कश्मीर:=0
-
जबकि k
-
अगर v[i, k] '&' के समान है, तो -
-
अस्थायी:=अस्थायी + वी[i, k]
-
(के द्वारा 1 बढ़ाएँ)
-
जबकि (k
-
अस्थायी:=अस्थायी + वी[i, k]
-
(के द्वारा 1 बढ़ाएँ)
-
-
अस्थायी:=अस्थायी + वी[i, k]
-
(के द्वारा 1 बढ़ाएँ)
-
अगर अस्थायी एम का सदस्य है, तो -
-
रिट:=रिट + एम [अस्थायी]
-
-
अन्यथा
-
रिट :=रिट + टेम्प
-
-
अस्थायी:=खाली स्ट्रिंग
-
-
अन्यथा
-
रिट:=रिट + वी[i, k]
-
(के द्वारा 1 बढ़ाएँ)
-
-
-
यदि अस्थायी का आकार 0 नहीं है और अस्थायी m का सदस्य है, तो -
-
रिट :=रिट कॉन्टेनेट एम [अस्थायी]
-
-
अन्यथा जब तापमान का आकार, तब -
-
रिट :=रेट कॉन्टेनेट टेम्प
-
-
यदि i, v के आकार के बराबर नहीं है, तो -
-
ret :=ret concatenate रिक्त स्थान
-
-
-
वापसी रिट
उदाहरण
आइए एक बेहतर समझ प्राप्त करने के लिए निम्नलिखित कार्यान्वयन देखें -
#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.