20.4.12 周赛 HTML实体解析器 中等

时间复杂度O(n),空间复杂度不会。。

解题、代码思路

  1. 字符串result存最终解析结果;
  2. 循环遍历字符串text,找到&时开始判断是不是特殊字符,不是&直接加入该字符到result;
  3. 判断特殊字符,如果是特殊字符,把特殊字符加入到result,假如不是特殊字符,将判断过的字符全部放进result;
  4. 用record记录判断过的字符的数量,flag记录是否是特殊字符;
  5. 遍历text跳过判断过的字符串。如果是特殊字符,跳过整一段特殊字符,如果不是特殊字符,跳过判断过的就行了;
  6. 判断特殊字符串我写得太繁琐了,其实是不熟悉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;
    }
};
posted @ 2020-04-12 13:24  肥斯大只仔  阅读(110)  评论(0编辑  收藏  举报