题目描述:
假设我们以下述方式将我们的文件系统抽象成一个字符串:
字符串 “dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext” 表示:
dir
subdir1
subdir2
file.ext
目录 dir 包含一个空的子目录 subdir1 和一个包含一个文件 file.ext 的子目录 subdir2 。
字符串 “dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext” 表示:
dir
subdir1
file1.ext
subsubdir1
subdir2
subsubdir2
file2.ext
目录 dir 包含两个子目录 subdir1 和 subdir2。 subdir1 包含一个文件 file1.ext 和一个空的二级子目录 subsubdir1。subdir2 包含一个二级子目录 subsubdir2 ,其中包含一个文件 file2.ext。
我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 “dir/subdir2/subsubdir2/file2.ext”,其长度为 32 (不包含双引号)。
给定一个以上述格式表示文件系统的字符串,返回文件系统中文件的最长绝对路径的长度。 如果系统中没有文件,返回 0。
说明:
文件名至少存在一个 . 和一个扩展名。
目录或者子目录的名字不能包含 .。
要求时间复杂度为 O(n) ,其中 n 是输入字符串的大小。
请注意,如果存在路径 aaaaaaaaaaaaaaaaaaaaa/sth.png 的话,那么 a/aa/aaa/file1.txt 就不是一个最长的路径。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-absolute-file-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int lengthLongestPath(String input) {
input = input.replace("\n ","\n\t");
//增加/路径,方便后面计算字符串大小
input = input.replace("\n\t","/\n\t");
String[] strs = input.split("\n");
int t_count = 0;
String tempStr = "",theBestLongStr = "";
for(int i=0;i< strs.length;i++){
int now_t_count = strs[i].length() - strs[i].replace("\t","").length();
if(now_t_count > t_count || now_t_count == 0){
tempStr = now_t_count > t_count ? tempStr + strs[i]:strs[i];
} else {
String t_str = "";
for(int j=1; j<=now_t_count;j++){
t_str += "\t";
}
String[] arg = tempStr.split(t_str);
tempStr = arg[0] + strs[i];
}
//只有文件路径会被记录下来
if(strs[i].contains(".")){
if(tempStr.endsWith("/")){
tempStr = tempStr.substring(0,tempStr.length() - 1);
}
if(theBestLongStr.equals("") || tempStr.replace("\t","").length() > theBestLongStr.replace("\t","").length()){
theBestLongStr = tempStr;
}
}
t_count = now_t_count;
}
//最后一个文件路径对比
tempStr = tempStr.replace("\t","");
theBestLongStr = theBestLongStr.replace("\t","");
if(tempStr.contains(".") && tempStr.length() > theBestLongStr.length()){
return tempStr.length();
}
return theBestLongStr.length();
}
}
额这个代码比较简单
class Solution {
public int lengthLongestPath(String input) {
if (input == null || input.length() == 0) return 0;
String[] dirs = input.split("\n");
int[] len = new int[dirs.length + 1];
int res = 0;
for (String dir: dirs) {
int numOfTabs = dir.lastIndexOf("\t") + 1;
int level = numOfTabs + 1;
// len[curLevel] = len[preLevel] + dir.length() - numOfTabs;
len[level] = len[level - 1] + dir.length() - numOfTabs + 1;
if (dir.contains("."))
res = Math.max(res, len[level] - 1);
}
return res;
}
}