20.4.12 周赛 HTML实体解析器 中等
时间复杂度O(n),空间复杂度不会。。
解题、代码思路
- 字符串result存最终解析结果;
- 循环遍历字符串text,找到&时开始判断是不是特殊字符,不是&直接加入该字符到result;
- 判断特殊字符,如果是特殊字符,把特殊字符加入到result,假如不是特殊字符,将判断过的字符全部放进result;
- 用record记录判断过的字符的数量,flag记录是否是特殊字符;
- 遍历text跳过判断过的字符串。如果是特殊字符,跳过整一段特殊字符,如果不是特殊字符,跳过判断过的就行了;
- 判断特殊字符串我写得太繁琐了,其实是不熟悉c++的STL,其实有很简单的写法。比如遇到&字符直接拿出他后面的适合长度的字符串进行判断。
代码
class Solution {
public:
string entityParser(string text) {
string result;
string shuangyinhao = """;
string danyinhao = "'";
string yufuhao = "&";
string dayuhao = ">";
string xiaoyuhao = "<";
string xiexianhao = "⁄";
for(int i = 0; i < text.length(); i++){
if(text[i] != '&'){
result.append(1, text[i]);
continue;
}
else{
int record = 1;
int index = i + 1;
int flag = 1;
if(text[index] == 'a'){
record++;
if(index + 1 < text.length() && text[index+1] == 'p'){
for(int j = index + 1, k = 2; j < text.length(); j++, k++){
record++;
if(danyinhao[k] != text[j]){
flag = 0;
break;
}
if(k == danyinhao.length() - 1) break;
}
if(flag) result.push_back(39);
}
if(index + 1 < text.length() && text[index+1] == 'm'){
for(int j = index + 1, k = 2; j < text.length(); j++, k++){
record++;
if(yufuhao[k] != text[j]){
flag = 0;
break;
}
if(k == yufuhao.length() - 1) break;
}
if(flag) result.push_back('&');
}
}
if(text[index] == 'q'){
record++;
for(int j = index + 1, k = 2; j < text.length(); j++, k++){
record++;
if(shuangyinhao[k] != text[j]){
flag = 0;
break;
}
if(k == shuangyinhao.length() - 1) break;
}
if(flag) result.push_back('"');
}
if(text[index] == 'g'){
record++;
for(int j = index + 1, k = 2; j < text.length(); j++, k++){
record++;
if(dayuhao[k] != text[j]){
flag = 0;
break;
}
if(k == dayuhao.length() - 1) break;
}
if(flag) result.push_back('>');
}
if(text[index] == 'l'){
record++;
for(int j = index + 1, k = 2; j < text.length(); j++, k++){
record++;
if(xiaoyuhao[k] != text[j]){
flag = 0;
break;
}
if(k == xiaoyuhao.length() - 1) break;
}
if(flag) result.push_back('<');
}
if(text[index] == 'f'){
record++;
for(int j = index + 1, k = 2; j < text.length(); j++, k++){
record++;
if(xiexianhao[k] != text[j]){
flag = 0;
break;
}
if(k == xiexianhao.length() - 1) break;
}
if(flag) result.push_back('/');
}
if(!flag)
for(int j = i; j < i + record; j++) result.append(1, text[j]);
i += (record - 1);
}
}
return result;
}
};