Suppose we abstract our file system by a string in the following manner:

The string "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" represents:

dir
subdir1
subdir2
file.ext

The directory dir contains an empty sub-directory subdir1 and a sub-directory subdir2 containing a file file.ext.

The string "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" represents:

dir
subdir1
file1.ext
subsubdir1
subdir2
subsubdir2
file2.ext

The directory dir contains two sub-directories subdir1 and subdir2subdir1 contains a file file1.ext and an empty second-level sub-directorysubsubdir1subdir2 contains a second-level sub-directory subsubdir2 containing a file file2.ext.

We are interested in finding the longest (number of characters) absolute path to a file within our file system. For example, in the second example above, the longest absolute path is "dir/subdir2/subsubdir2/file2.ext", and its length is 32 (not including the double quotes).

Given a string representing the file system in the above format, return the length of the longest absolute path to file in the abstracted file system. If there is no file in the system, return 0.

Note:

  • The name of a file contains at least a . and an extension.
  • The name of a directory or sub-directory will not contain a ..

Time complexity required: O(n) where n is the size of the input string.

Notice that a/aa/aaa/file1.txt is not the longest file path, if there is another path aaaaaaaaaaaaaaaaaaaaa/sth.png.

解法1:栈Stack

一个字符串表示文件系统的目录结构,里面包含\n(回车)和\t(tab)的特殊字符,要找到最长的绝对文件路径。
可用栈Stack, Array, Hash table来保存每一层的最长路径长度。以栈为例:

1. 将字符串以'\n'进行拆分,得到目录字符串数组,设置最大长度变量 maxLen = 0,设置一个 Stack,初始设为0层为0。

2. 对这个数组迭代,对于每个目录字符串统计其前面的'\t'个数, 个数加1就是当前目录的层深度,比如: 0个'\t',层数就是1,1个'\t',层数是2。

3. 比较当前目录层数和栈顶层数:

1)如果目录层数大于栈顶层数:判断是否含'.' ,

a. 不含'.',则是目录,计算当前目录长度(字符长度+1因为要多1个"/")+ 上层目录最大长度,长度入栈。

b. 含'.' , 则为文件,计算当前文件长度(字符长度),此长度加上栈顶元素长度(上层目录最大长度)和maxLen比较取最大。

2)如果目录层数小于栈顶层数:

则弹出栈顶元素,用while循环,一直弹到栈顶的层小于当前层数。然后重复上面的a, b步骤

最后,返回maxLen.

解法2:哈希表HashMap

Java: Stack, Time: O(n), Space: O(n)

public class Solution {
public int lengthLongestPath(String input) {
String[] lines = input.split("\n");
Stack<Integer> path = new Stack<>();
path.push(0);
int max = 0; for (String line : lines) {
int tabIndex = line.lastIndexOf("\t") + 1;
while (path.size() - 1 > tabIndex) {
path.pop();
}
int length = path.peek() + 1 + line.length() - tabIndex;
path.push(length);
if (line.indexOf(".") != -1)
max = Math.max(max, length - 1);
} return max;
}
}

Java: DP Array, Time: O(n), Space: O(n)

public class Solution {
public int lengthLongestPath(String input) {
String[] lines = input.split("\n");
int[] length = new int[lines.length + 1];
int max = 0; for (String line : lines) {
int depth = line.lastIndexOf("\t") + 1;
length[depth + 1] = length[depth] + 1 + line.length() - depth;
if (line.indexOf(".") != -1) {
max = Math.max(max, length[depth + 1] - 1);
}
}
return max;
}
}  

Java: Stack

class Solution {
public int lengthLongestPath(String input) {
Deque<Integer> stack = new ArrayDeque<>();
stack.push(0); // "dummy" length
int maxLen = 0;
for(String s:input.split("\n")){
int lev = s.lastIndexOf("\t") + 1; // number of "\t"
while(lev + 1 < stack.size()) stack.pop(); // find parent
int len = stack.peek() + s.length() - lev + 1; // remove "/t", add"/"
stack.push(len);
// check if it is file
if(s.contains(".")) maxLen = Math.max(maxLen, len - 1);
}
return maxLen;
}
}

Java: Array instead of Stack

class Solution {
public int lengthLongestPath(String input) {
String[] paths = input.split("\n");
int[] stack = new int[paths.length+1];
int maxLen = 0;
for(String s:paths){
int lev = s.lastIndexOf("\t")+1, curLen = stack[lev+1] = stack[lev] + s.length() - lev + 1;
if(s.contains(".")) maxLen = Math.max(maxLen, curLen - 1);
}
return maxLen;
}  
}

Python: HashMap

class Solution(object):
def lengthLongestPath(self, input):
"""
:type input: str
:rtype: int
"""
maxlen = 0
pathlen = {0: 0}
for line in input.splitlines():
name = line.lstrip('\t')
depth = len(line) - len(name)
if '.' in name:
maxlen = max(maxlen, pathlen[depth] + len(name))
else:
pathlen[depth + 1] = pathlen[depth] + len(name) + 1
return maxlen  

Python: HashMap

class Solution(object):
def lengthLongestPath(self, input):
"""
:type input: str
:rtype: int
"""
def split_iter(s, tok):
start = 0
for i in xrange(len(s)):
if s[i] == tok:
yield s[start:i]
start = i + 1
yield s[start:] max_len = 0
path_len = {0: 0}
for line in split_iter(input, '\n'):
name = line.lstrip('\t')
depth = len(line) - len(name)
if '.' in name:
max_len = max(max_len, path_len[depth] + len(name))
else:
path_len[depth + 1] = path_len[depth] + len(name) + 1
return max_len

C++: Stack

class Solution {
public:
int lengthLongestPath(string input) {
input+= '\n';
int len = input.size(), ans = 0, spaceCnt = 0, curPathLen =0, dotFlag = 0;
stack<pair<string, int> > st;
string curDir, extension;
for(int i = 0; i < len; i++)
{
if(input[i]!='\n')
{
if(input[i]!='\t') curDir += input[i];
if(dotFlag) extension += input[i];
if(input[i]=='\t') spaceCnt++;
if(input[i]=='.') dotFlag = 1;
continue;
}
while(!st.empty() && spaceCnt <= st.top().second)
{
curPathLen -= st.top().first.size();
st.pop();
}
if(dotFlag) ans = max(curPathLen + (int)curDir.size() + 1, ans);
else
{
st.push(make_pair("/"+ curDir, spaceCnt));
curPathLen += curDir.size() + 1;
}
extension = "", dotFlag = 0, spaceCnt = 0, curDir = "";
}
return ans==0?0:ans-1;
}
};

  

All LeetCode Questions List 题目汇总

[LeetCode] 388. Longest Absolute File Path 最长的绝对文件路径的更多相关文章

  1. 388 Longest Absolute File Path 最长的绝对文件路径

    详见:https://leetcode.com/problems/longest-absolute-file-path/description/ C++: class Solution { publi ...

  2. [LeetCode] Longest Absolute File Path 最长的绝对文件路径

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  3. 【LeetCode】388. Longest Absolute File Path 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述: 题目大意 解题方法 日期 题目地址:https://leetcode. ...

  4. 【leetcode】388. Longest Absolute File Path

    题目如下: Suppose we abstract our file system by a string in the following manner: The string "dir\ ...

  5. 388. Longest Absolute File Path

    就是看哪个文件的绝对路径最长,不是看最深,是看最长,跟文件夹名,文件名都有关. \n表示一波,可能存在一个文件,可能只有文件夹,但是我们需要检测. 之后的\t表示层数. 思路是如果当前层数多余已经有的 ...

  6. leetcode 388.Lonest Absolute File Path

    要求寻找的是最长的长度的,那么考虑文件夹和文件的存在的不同形式的,利用当前所存在的层数和对应的长度之间做一个映射关系的并且用于计算总的长度关系的. class Solution { public: i ...

  7. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  8. Leetcode: Longest Absolute File Path

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  9. Leetcode算法比赛----Longest Absolute File Path

    问题描述 Suppose we abstract our file system by a string in the following manner: The string "dir\n ...

随机推荐

  1. Pure C static coding analysis tools

    Cppcheck - A tool for static C/C++ code analysiscppcheck.sourceforge.netCppcheck is a static analysi ...

  2. waitpid()函数

    waitpid函数 作用同于wait,但可指定pid进程清理,可以不阻塞. pid_t waitpid(pid_t pid,int *status,int options);成功:返回清理掉的子进程I ...

  3. WebKit应用程序开发的起因

    公司的Web管理界面,用起来还可以,但是有一个问题一直无法解决. 在web页面上需要播放视频,由于比较这个功能比较老,不支持web模式播放,只支持CS模式,具体原因及不说了. 于是有了 winform ...

  4. kafka没配置好,导致服务器重启之后,topic丢失,topic里面的消息也丢失

    转,原文:https://blog.csdn.net/zfszhangyuan/article/details/53389916 ----------------------------------- ...

  5. PHP——数组根据某一键值合并

    前言 其实要实现很简单直接foreach,再根据PHP中数组的特性就可以轻松实现. 步骤 这是源数据的格式 $info = [ [ "gname" => "特别关心 ...

  6. xshell连接不上阿里云服务器Could not connect to 'ip' (port 22): Connection failed.解决过程

    记一次xshell阿里云服务器突然连接不上的解决办法: 1, 确认阿里云服务器安全组出入都有22,百度出来都说的这个和ip拦截设置,以防万一都设置了:但楼主设置后,还是连不上服务器: 只好下一步 2, ...

  7. springboot项目报错Could not resolve placeholder 'datasource.type' in value "${datasource.type}"解决办法

    一,首先确认数据库的连接信息是否都正确,数据库能否正常连接(例如用客户端能连接上):二,确认配置文件中datasource.type配置是否正确,此处我们公司用的阿里的是com.alibaba.dru ...

  8. django-导入应用包的搜索路径

    创建应用包 在 settings.py注册和配置urls.py中要按顺序导入包名和应用名 settings.py INSTALLED_APPS = ( 'django.contrib.admin', ...

  9. 使用mybatis框架实现带条件查询-多条件(传入Map集合)

    我们发现我们可以通过传入javaBean的方式实现我们的需求,但是就两个条件,思考:现在就给他传入一个实体类,对系统性能的开销是不是有点大了. 现在改用传入Map集合的方式: 奥!对了,在创建map集 ...

  10. 虚拟机Linux系统ip查询失败问题

    当用SSH连接Linux需要ip地址,但是不论是通过ipconfig命令,还是通过ip addr命令都无法获取Linux的ip,通过以下方法成功解决了该问题: 1.点击编辑里面的虚拟网络编辑器出现如下 ...