388. 文件的最长绝对路径

136 阅读1分钟

leetcode-cn.com/problems/lo…

用栈来模拟文件的搜索过程,栈内存放的是当前已经搜索到的文件路径长度和 采用双指针算法,每次操作一个文件或目录

class Solution {
public:
    bool isFile(const string &s){
            for(auto it:s){
                if(it=='.') return 1;
            }
            return 0;
    }
    int lengthLongestPath(string input) {
        int len=0,ans=0;
        stack<int> s;
        for(int i=0;i<input.length();){
            int j=i,tt=0; //tt记录 \t出现次数 
            while(j<input.length()&&input[j]!='\n'){
                tt+=(input[j]=='\t');
                j++;
            }
            while(tt<s.size()){
                len-=s.top();
                s.pop();
            }
            s.push(j-i-tt);
            len+=j-i-tt;
            if(isFile(input.substr(i,j-i)))
            ans=max(ans,len+(int)s.size()-1);
            i=j+1;
        }
        return ans;
    }
};
class Solution {
    boolean isFile(String s){
        return s.contains(".");
    }
    public int lengthLongestPath(String s) {
        int ans=0,len=0;
        Stack<Integer> stack=new Stack<>();
        String[] strs=s.split("\n");
        for(int i=0;i<strs.length;i++){
            int j=0;
            while(j<strs[i].length()&&strs[i].charAt(j)=='\t') j++;
            
            while(stack.size()!=0&&j<stack.size()) {
                len-=stack.peek();
                stack.pop();
            }

            len+=strs[i].length()-j;
            stack.push(strs[i].length()-j);            

            if(isFile(strs[i])){
                ans=Math.max(ans,len+stack.size()-1);
            }
        }
        return ans;
    }
}