最长文件路径名(Longest Absolute File Path)

    /*
     * 假设我们通过以下的方式用字符串来抽象我们的文件系统:
     *       字符串"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;
    }

猜你喜欢

转载自blog.csdn.net/wenbooboo/article/details/81215178