/*
* 假设我们通过以下的方式用字符串来抽象我们的文件系统:
* 字符串"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/subdir2/subsubdir2/file2.ext”,其长度为 32 (不包括双引号)。
* 给定一个以上述格式表示文件系统的字符串,返回抽象文件系统中文件最长绝对路径的长度。如果系统中没有文件,则返回 0 。
* Action:
* 一个文件的名称至少包含一个 . 和扩展名。
* 目录或子目录的名称不会包含 . 。
* 时间复杂度要求: O(n) 其中 n 是输入字符串的大小。
* 请注意如果有另一条路径 aaaaaaaaaaaaaaaaaaaaa / sth.png 存在的话, a/aa/aaa/file1.txt 不是最长的文件路径。
*/
我们可以把\n当作换行符,把\t当作tab键,把抽象文件系统打印出来后,其实就相当于我们电脑的文件系统树,\n代表一个新的文件或文件夹,\t个数代表这个文件或文件夹所处的层级(level),用Stack来存储到每层级位置文件名长度。
private int LongestAbsoluteFilePath(string path)
{
if (string.IsNullOrEmpty(path))
return 0;
Stack<int> stack = new Stack<int>(); //存放各级文件长度
int longestLen = 0;
string[] strs = path.Split('\n');
foreach (string item in strs)
{
int level = item.LastIndexOf('\t') + 1; //计算当前文件的层级
while (stack.Count > level) //返回到上一个同级文件的位置
{ //例如:示例中遇到 \tsubdir2 时返回到
stack.Pop(); //与它同级的 \tsubdir1 位置
}
int tempLen = item.Length - level;
if (stack.Count == 0)
stack.Push(tempLen);
else
stack.Push(tempLen + stack.Peek() + 1); //加1 是返回的结果带有 / 分割
if (item.Contains("."))
{
longestLen = Mathf.Max(longestLen, stack.Peek());
}
}
return longestLen;
}