文件的最长绝对路径的思路探讨与源码
文件的最长绝对路径的题目如下图,该题属于搜索类和栈类型的题目,主要考察对于搜索方法的使用和栈结构的理解。本文的题目作者想到2种方法,分别是栈方法和前缀和方法,其中栈方法使用Java进行编写,而前缀和方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以使用栈方法的思路进行解决,首先初始化参数和队列,开始遍历循环,对于每个下标都判断是否超出字符串长度并且判断当前字符是否为制表符,如果是则下标加1并且深度加1,然后继续进行判断,判断是否当前元素为换行符,如果是就继续搜索判断后续元素是否有英文句号,如果是就将文件判断标志设置为true。按此思路进行搜索,直到遍历结束并返回结果。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
public int lengthLongestPath(String input) {
int numLen = input.length();
int pos = 0;
int res = 0;
Deque<Integer> stackList = new ArrayDeque<Integer>();
while (pos < numLen) {
int depthNum = 1;
while (pos < numLen && input.charAt(pos) == '\t') {
pos = pos + 1;
depthNum = depthNum + 1;
}
boolean isFile = false;
int len = 0;
while (pos < numLen && input.charAt(pos) != '\n') {
if (input.charAt(pos) == '.') {
isFile = true;
}
len = len + 1;
pos = pos + 1;
}
pos = pos + 1;
while (stackList.size() >= depthNum) {
stackList.pop();
}
if (!stackList.isEmpty()) {
len = len + stackList.peek() + 1;
}
if (isFile) {
res = Math.max(res, len);
} else {
stackList.push(len);
}
}
return res;
}
}
显然,我们的栈方法的效果还不错,还可以使用前缀和的方法解决。首先初始化参数并且设置一个字典,对于字符串按换行符进行分割后开始循环,对于每个循环内的字符串统计包含制表符的数量并记录到字典,如果当前子字符串包含英文句号,就将结果和字典对应的更大值加上当前深度值后进行赋值,直到最终遍历结束并返回结果。所以按照这个思路就可以解决,下面是Python代码:
#喷火龙与水箭龟
class Solution:
def lengthLongestPath(self, input: str) -> int:
res = 0
depth_length_map = {-1: 0}
for line in input.split('\n'):
depthNum = line.count('\t')
depth_length_map[depthNum] = depth_length_map[depthNum - 1] + len(line) - depthNum
if line.count('.'):
res = max(res, depth_length_map[depthNum] + depthNum)
return res
从结果来说Java版本栈方法的效率还可以,而Python版本的前缀和方法的速度也还不错,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。