解析列表并打印所有最终路径

Parse list and print all final paths

给定的行有不同的缩进

orange
 blue
  yellow
  black
  white
 green

打印所有最终路径。

预期输出

orange/blue/yellow
orange/blue/black
orange/blue/white
orange/green

如何解析所有行(非二叉树)以打印最终(完整)路径?

该算法将使用堆栈:

保留一堆对,其中每对包含一个(部分)路径及其最后部分的缩进。堆栈中的条目总是通过缩进增加。堆栈开始为空。

对于输入的每一行,确定其缩进。只要堆栈上有等于或大于的缩进,就从堆栈中删除这些对。然后获取堆栈顶部的路径,将当前行附加到该路径(没有缩进,由 / 分隔),将其与新的缩进配对,并将其推入堆栈。输出该路径并为下一个输入行重复该过程。

这是 JavaScript 中的一个实现:

function getIndent(s) {
    return s.search(/\S/); // Index of first non-white-space character
}

function getPaths(text) {
    let stack = [];
    let paths = [];
    for (let line of text.split("\n")) {
        let indent = getIndent(line);
        while (stack.length > 0 && indent <= stack.at(-1).indent) {
            stack.pop();
        }
        let path = (stack.length > 0 ? stack.at(-1).path + "/" : "") + line.trim();
        stack.push({path, indent});
        paths.push(path);
    }
    return paths;
}

// Sample input
let text = 
`orange
 blue
  yellow
  black
  white
 green`;
 
for (let path of getPaths(text)) {
    console.log(path);
}