385. Mini Parser

本文介绍了一种高效的字符串解析方法,该方法使用迭代而非递归来解析嵌套整数列表。通过运用栈来跟踪嵌套结构,文章提供了一个简洁的实现方案。
Given a nested list of integers represented as a string, implement a parser to deserialize it.
Each element is either an integer, or a list -- whose elements may also be integers or other lists.
Note: You may assume that the string is well-formed:
  • String is non-empty.
  • String does not contain white spaces.
  • String contains only digits 0-9[- ,].
Example 1:
Given s = "324",
You should return a NestedInteger object which contains a single integer 324.
Example 2:
Given s = "[123,[456,[789]]]",
Return a NestedInteger object containing a nested list with 2 elements:
1. An integer containing value 123.
2. A nested list containing two elements:
    i.  An integer containing value 456.
    ii. A nested list with one element:
         a. An integer containing value 789.

自己本来是用循环写的 结果陷入处理各种edge case的泥潭 
类似匹配括号的这种题 还是用stack吧 
以下是discuss中vote最高
This approach will just iterate through every char in the string (no recursion).
  • If encounters '[', push current NestedInteger to stack and start a new one.
  • If encounters ']', end current NestedInteger and pop a NestedInteger from stack to continue.
  • If encounters ',', append a new number to curr NestedInteger, if this comma is not right after a brackets.
  • Update index l and r, where l shall point to the start of a integer substring, while r shall points to the end+1 of substring.
public NestedInteger deserialize(String s) {
    if (s.isEmpty())
        return null;
    if (s.charAt(0) != '[') // ERROR: special case
        return new NestedInteger(Integer.valueOf(s));
        
    Stack<NestedInteger> stack = new Stack<>();
    NestedInteger curr = null;
    int l = 0; // l shall point to the start of a number substring; 
               // r shall point to the end+1 of a number substring
    for (int r = 0; r < s.length(); r++) {
        char ch = s.charAt(r);
        if (ch == '[') {
            if (curr != null) {
                stack.push(curr);
            }
            curr = new NestedInteger();
            l = r+1;
        } else if (ch == ']') {
            String num = s.substring(l, r);
            if (!num.isEmpty())
                curr.add(new NestedInteger(Integer.valueOf(num)));
            if (!stack.isEmpty()) {
                NestedInteger pop = stack.pop();
                pop.add(curr);
                curr = pop;
            }
            l = r+1;
        } else if (ch == ',') {
            if (s.charAt(r-1) != ']') {
                String num = s.substring(l, r);
                curr.add(new NestedInteger(Integer.valueOf(num)));
            }
            l = r+1;
        }
    }
    
    return curr;
}


`mini-html-parser2` 是一个轻量级的 HTML 解析库,通常用于将 HTML 字符串解析为结构化的数据格式(如 JSON),以便在程序中更方便地操作和处理 HTML 内容。它在小程序开发、前端模板解析、内容渲染等场景中较为常见。 ### 用途 1. **HTML 解析**:可以将 HTML 字符串解析成 AST(抽象语法树)形式,便于后续处理或转换。 2. **小程序富文本渲染**:在微信小程序等环境中,常用于解析 HTML 内容并将其转换为小程序支持的 WXML 结构[^2]。 3. **自定义渲染逻辑**:通过解析后的节点结构,开发者可以实现对 HTML 标签和属性的自定义处理逻辑。 ### 使用方法 #### 安装 如果该库已发布到 npm,可以通过以下命令安装: ```bash npm install mini-html-parser2 ``` #### 基本用法 以下是一个简单的代码示例,展示如何使用 `mini-html-parser2` 解析 HTML 字符串: ```javascript const parser = require('mini-html-parser2'); const html = ` <div class="container"> <p>Hello, <strong>world</strong>!</p> </div> `; parser.parse(html, { start(tagName, attrs, unary) { console.log('Start tag:', tagName); console.log('Attributes:', attrs); console.log('Is unary:', unary); }, end(tagName) { console.log('End tag:', tagName); }, chars(text) { console.log('Text:', text); }, comment(text) { console.log('Comment:', text); } }); ``` #### 输出说明 - `start(tagName, attrs, unary)`:当遇到开始标签时触发,输出标签名、属性对象以及是否为单标签。 - `end(tagName)`:当遇到结束标签时触发,输出标签名。 - `chars(text)`:当遇到文本内容时触发,输出文本内容。 - `comment(text)`:当遇到注释时触发,输出注释内容。 ### 示例应用场景 在小程序中,若需要将 HTML 内容渲染为可视化的结构,可以结合 `mini-html-parser2` 和小程序的组件系统实现。例如: ```javascript const parser = require('mini-html-parser2'); function parseHtmlToWxml(html) { let nodes = []; parser.parse(html, { start(tagName, attrs, unary) { nodes.push({ type: 'element', tagName, attrs }); }, end() { // 处理闭合标签 }, chars(text) { if (text.trim()) { nodes.push({ type: 'text', text }); } } }); return nodes; } ``` 然后可以在 WXML 中递归渲染这些节点。 ### 注意事项 - `mini-html-parser2` 的 API 可能会因版本不同而有所变化,建议查阅其官方文档以获取最新用法。 - 若项目中涉及复杂的 HTML 解析需求,可考虑结合其他成熟的 HTML 解析库(如 `htmlparser2` 或 `parse5`)进行扩展。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值