问题描述


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 subdir2. subdir1 contains a file file1.ext and an empty second-level sub-directory subsubdir1. subdir2 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.

package code;

import java.util.ArrayList;

public class Solution {
static int startPos=0;
static int nextLevel=0; public int lengthLongestPath(String input) {
startPos=0;
MyList list=new MyList(null, 0, 0, null);//新建一个空的MyList,表示根目录
deal(list,input, 0);
if(list.containsFile){
return list.subLength-1; //因为在第一层的目录之前算上了'/' 符号,要去除掉
}
else{
return 0;
}
} public static void deal(MyList parent,String input,int curLevel){
while(startPos<input.length()){ //startPos是全局指针,用以标识当前正在处理原是字符串的哪一部分
String curStr=input.substring(startPos);
int len=curStr.indexOf('\n');
if(len>0){
startPos+=len+1;
String fileName=curStr.substring(0, len);
MyList current=new MyList(parent,len,0,fileName);
parent.subs.add(current);
//current.myLength=fileName.length();
current.myLength=len; //省去了fileName.length()函数调用
if(fileName.indexOf('.')>0){
parent.containsFile=true;
if(parent.subLength<len+1){
parent.subLength=len+1;//加 1 是为了在子目录之前算上'/'符号
}
}
nextLevel=findNextLevel(input);
startPos+=nextLevel;
if(nextLevel==curLevel+1){
//正好是下一级
deal(current,input,nextLevel);
if(current.containsFile){
parent.containsFile=true;
int newLength=current.myLength+current.subLength+1;//加 1 是为了在子目录之前算上'/'符号
if(parent.subLength<newLength){
parent.subLength=newLength;
}
} }
if(nextLevel<curLevel){
/*说明接下来要处理的文件或目录名层级比本层级高,因此要退出当前层 级的处理,也正是因为下一个层级可能比
* 之前好几个层级都高,所以应当把nextLevel定义为全局变量,使得 退出一个层级的deal后,nextLevel得以完整,
* 在返回到栈中的上一个deal的环境中时,让会继续比较那个栈环境中 的currentLevel和nextLevel
*/
break;
}
//如果nextLevel==curLevel,那么就继续循环
}
else{
//len<0说明当前处理的是最后一个 file or directory 的name
startPos+=curStr.length();
MyList current=new MyList(parent,len,-1,curStr);//故意将 subLength=-1
parent.subs.add(current);
if(curStr.indexOf('.')>0){
//是 file
parent.containsFile=true;
if(parent.subLength<curStr.length()+1){
parent.subLength=curStr.length()+1;
}
} break;
} }
} public static int findNextLevel(String input){
int level=0;
while(input.charAt(startPos+level)=='\t'){//通过数制表符的个数判断层级
level++;
}
return level;
} static class MyList{;
String myName;
MyList parent;
int myLength;
int subLength;
boolean containsFile=false;//默认情况下子目录下没有File
ArrayList<MyList>subs=new ArrayList<>();
public MyList(MyList parent,int myLength,int subLength,String myName){
this.parent=parent;
this.myLength=myLength;
this.subLength=subLength;
this.myName=myName;
}
}
}

Leetcode算法比赛----Longest Absolute File Path的更多相关文章

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

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

  2. 【leetcode】388. Longest Absolute File Path

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

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

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

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

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

  5. Leetcode: Longest Absolute File Path

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

  6. Longest Absolute File Path -- LeetCode

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

  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. Longest Absolute File Path

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

  9. 388. Longest Absolute File Path

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

随机推荐

  1. canvas+js+面向对象的圆形封装

    效果: Circle.js /* 1. 封装属性: x, y r, fillStyle strokeStyle opacity 2.render */ function Circle(option) ...

  2. 11种绕过CDN查找真实IP方法

    0x01 验证是否存在CDN 方法1: 很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有: http://ping.chin ...

  3. [性能测试]:ISO8583报文解析实例

    现在我们有ISO8583报文如下(十六进制表示法): 60 00 03 00 00 60 31 00 31 07 30 02 00 30 20 04 C0 20 C0 98 11 00 00 00 0 ...

  4. <VS2017> 编写VC++单元测试 -(一)新建单元测试工程

    开发人员自己编写单元测试是一个非常好的习惯.单元测试不但能够验证自己所编写的代码是否存在问题,避免提交给测试人员时才发现bug,也可以为将来改动代码的人提供验证代码功能正确性的途径.在我有限的工作生涯 ...

  5. mvn pom

    使用本地指定目录下jar包 <dependency> <groupId>com.myself.abc</groupId> <artifactId>sam ...

  6. 移动端的touchstart,touchmove,touchend事件中的获取当前touch位置

    前提:touchstart,touchmove,touchend这三个事件可以通过原生和jq绑定. 原生:document.querySelector("#aa").addEven ...

  7. 联想G480安装固态硬盘过程

    联想G480安装固态硬盘过程  百度上面图文并茂: https://jingyan.baidu.com/article/e2284b2b68eaf6e2e6118de1.html

  8. TypeScript 乱糟笔记

    数组头上插一个值. var arr: Array<String> = ['a', 'b', 'c'];arr.unshift('d'); object删除元素. var obj: Obje ...

  9. WCF WCF的宿主

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  10. golang类型转化

     int 转 float mean:= float32(sum)   float 转 int a := 5.0 b := int(a)   string 转 int i,_ := strconv.At ...