首页 > 其他分享 >LeetCode 388.文件的最长绝对路径

LeetCode 388.文件的最长绝对路径

时间:2023-06-07 14:01:00浏览次数:53  
标签:路径 pos LeetCode 当前 st 388 长度 绝对路径 节点


题目链接

思路

针对文件路径的特征,一个文件中一定包含.分隔符,以此为依据可以判定当前字符串是否是一个文件,文件系统是一个树形结构的角度来看的话,题中给定的字符串实际上是以一个树形结构前序遍历的序列,连续的\t表示出了当前的深度,而相邻的节点之间以\n进行分割。
假设当前的路径为x/y/z,其中LeetCode 388.文件的最长绝对路径_leetcode的文件名长度为分别为LeetCode 388.文件的最长绝对路径_算法_02则路径&x, x/y, x/y/z&的长度分别为LeetCode 388.文件的最长绝对路径_文件名_03。利用栈保存当前已遍历的路径长度,栈中元素个数即为当前路径的深度,栈顶元素即为当前路径的长度。设当前节点的文件名为q,当前节点的文件名长度为LeetCode 388.文件的最长绝对路径_leetcode_04,节点深度为depth,据此本题中应当可以有如下判断:

  • 如果当前节点的深度大于当前路径的深度,则表明当前节点为栈顶节点的孩子节点,设当前栈顶结点的长度为t,栈顶节点的路径为p,则当前的文件路径应当为p/q
  • 如果当前节点深度小于当前路径的深度,则表明当前节点不是栈顶节点的孩子节点,此时则需要一直退回到其父节点再进行求解。
  • 由于题目只要求得出文件的长度,因此在实际运算中不需要保存具体的文件名称,只需要保存文件名的长度即可。检测当前节点的文件名的长度并标记当前的文件名是文件还是文件夹,如果当前的字符串为文件,则求出当前文件绝对路径的长度。遍历所有可能的文件长度,即可找到文件绝对路径的最大长度。

代码

class Solution {
public:
    int lengthLongestPath(string input) {
        int n = input.size();
        int pos = 0, ans = 0;
        stack<int> st;

        while(pos < n)
        {
            int depth = 1;
            while(pos < n && input[pos] == '\t')
            {
                depth++;
                pos++;
            }
            int len=0;
            bool isFile = false;
            while(pos < n && input[pos] != '\n')
            {
                if(input[pos] == '.')   isFile = true;
                pos++;
                len++;
            }
            pos++;//换行符
            while(st.size() >= depth)   st.pop();
            if(!st.empty()) len+=st.top() + 1;
            if(isFile)  ans = max(ans, len);
            else st.emplace(len);  
        }
        return ans;
    }
};


标签:路径,pos,LeetCode,当前,st,388,长度,绝对路径,节点
From: https://blog.51cto.com/u_15567308/6431289

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的右视图
    1.简述:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例2:输入: [1,null,3]输出: [1,3]示例3:输入: []输出: []2.代码实现:classSolution{publicList<I......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树中的最大路径和
    题目:二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点root,返回其最大路径和。 示例1:输入:root=......
  • Leetcode 2352. 相等行列对
    题目:给你一个下标从0开始、大小为nxn的整数矩阵grid,返回满足\(R_i\)行和\(C_j\)列相等的行列对(\(R_i\),\(C_j\))的数目。如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。难度:中等示例1:输入:grid=[[3,2,1],[1,7,6],[2,7,7]]输出:1......
  • [LeetCode] 1347. Minimum Number of Steps to Make Two Strings Anagram 制造字母异
    Youaregiventwostringsofthesamelength s and t.Inonestepyoucanchoose anycharacter of t andreplaceitwith anothercharacter.Return theminimumnumberofsteps tomake t ananagramof s.An Anagram ofastringisastringthatco......
  • leetcode-图论总结
    此文总结一下常见图论算法,代码可以为后续遇见类似题目提供参考:1.图的表示:邻接矩阵:可通过创建数组得到邻接表:我个人喜欢通过LinkedList<int[]>[]graph=newLinkedList[n];得到。EdgeList:同样可以通过LinkedList<int[]>[]graph=newLinkedList[n];得到。2.图遍历:DF......
  • 树之深度优先遍历算法详解(DFS实现) LeetCode94
           本文以如下树结构为例深度优先(DeepFirstSearch)       树的孩子称作子树,对于一个树进行深度优先遍历,即将其某一子树下所有节点遍历完再去遍历其他子树。遍历的顺序以根为参照可分为先序遍历,中序遍历,后序遍历。遍历方式描述先序遍历根左右中序遍历左根右后......
  • leetcode-滑动窗口总结
    滑动窗口是我在刷题时感觉比较困难的部分,简单做一个总结,防止之后又忘了:一般模板如下://注意:java代码由chatGPT......
  • Leetcode 2460. 对数组执行操作
    题目:给你一个下标从0开始的数组nums,数组大小为n,且由非负整数组成。你需要对数组执行n-1步操作,其中第i步操作(从0开始计数)要求对nums中第i个元素执行下述指令:如果nums[i]==nums[i+1],则nums[i]的值变成原来的2倍,nums[i+1]的值变成0。否则,跳过......
  • [LeetCode] 2460. Apply Operations to an Array
    Youaregivena 0-indexed array nums ofsize n consistingof non-negative integers.Youneedtoapply n-1 operationstothisarraywhere,inthe ith operation(0-indexed),youwillapplythefollowingonthe ith elementof nums:If nums[i]......
  • LeetCode 669. 修剪二叉搜索树
    思路遍历所有节点,如果当前节点不在所给区间里,删除该点;否则如果该点要被删除,将其左右子树其中之一提上来即可根节点位于左右子树取值区间的中间,如果该点要被删除,那么一定存在不满足要求的子树,不可能两棵子树同时保留代码classSolution{public:TreeNode*trimBST(......