问题描述


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绘制折线图

    效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  2. 【算法笔记】A1063 Set Similarity

    1063 Set Similarity (25 分)   Given two sets of integers, the similarity of the sets is defined to be ...

  3. HDU - 6133 启发式合并

    题意:给出一棵树共\(n\)个顶点,每个顶点有一个权值\(val_i\),你需要对每个节点统计一个最优解 每个节点的解按照一定规则产生:取出该节点的子树下所有的顶点,把顶点任意排序成一个序列,设为\( ...

  4. 03-树2 List Leaves (25 分)

    Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...

  5. PHP常见缓存机制

    PHP常用的几种缓存机制_PHP教程 普遍缓存技术 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, ...

  6. Q138 复制带随机指针的链表

    给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入: {"$id":"1",& ...

  7. (转)多种方法实现Loading(加载)动画效果

    当我们ajax提交一个按钮的时候,给那个按钮来个Loading效果会高端很多,体验也会上升个层次. 既能让用户知道正在提交中,也能防止二次提交,好处多多呢.

  8. Install NDK in Eclipse/Android Studio

    1. Download NDK https://developer.android.com/tools/sdk/ndk/index.html 2.Install NDK $ tar xvf andro ...

  9. Chapter 7. Packages

    Chapter 7. Packages The hierarchical naming structure for packages is intended to be convenient for ...

  10. AngularJS Eclipse Plugin

    本文介绍如何安装和配置 AngularJS Eclipse.AngularJS Eclipse 插件是基于强大的 JavaScript 推断引擎(javascript inference engine ...