สมมติว่าเรามีสตริง ต้องออกแบบ HTML parser ที่แทนที่ special character entities ด้วยตัวอักษรจริง: "→", '→', &→&, >→>, <→<, ⁄→/
ตัวอย่าง: "& is changed but &ambassador; is not." → "& is changed but &ambassador; is not."
วิธีแก้ปัญหา
- แยกสตริงด้วย space
- สแกนแต่ละ token หา pattern &...;
- ถ้าตรงกับ entity ใน map ให้แทนที่
- รวมกลับเป็นสตริง
ตัวอย่างโค้ด C++
#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;
}
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 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;
}
};
int main(){
Solution ob;
cout << (ob.entityParser("& is changed but &ambassador; is not."));
}ข้อมูลนำเข้า
"& is changed but &ambassador; is not."
ผลลัพธ์
& is changed but &ambassador; is not.