首页 > 其他分享 >1233. 删除子文件夹

1233. 删除子文件夹

时间:2023-04-07 20:27:01浏览次数:56  
标签:文件夹 fid 删除 1233 vector str ans folder

题目链接:1233. 删除子文件夹

方法一:排序 + 循环

解题思路

先对 \(folder\) 数组根据字典序进行排序,排序完成后,扫描 \(folder\) 数组。由于在同一个高层目录下的文件夹在同一段区域,那么这一段区域的第一个文件夹就是这一系列文件夹的最高层目录 \((high)\),将其加入结果数组中。当出现以下情况之一时,表明扫描到下一区域:

  • 当前文件名长度 \(< high.size()\) 时,因为子文件夹名长度一定大于其高层文件夹名;
  • \(high\) 不是当前文件夹名的前缀;
  • 当前文件夹名的第 \(high.size()\)(从 \(0\) 开始)个字符 != '/',一定不是其子文件夹。

代码

class Solution {
public:
    vector<string> removeSubfolders(vector<string>& folder) {
        sort(folder.begin(), folder.end());
        vector<string> ans{folder[0]};
        for (int i = 1; i < folder.size(); i ++ ) {
            int pre = (*ans.rbegin()).size();
            if (pre >= folder[i].size() || *ans.rbegin() != folder[i].substr(0, pre) || folder[i][pre] != '/') ans.emplace_back(folder[i]);
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(nlogn)\);
空间复杂度:\(O(1)\)。

方法二:字典树

解题思路

参考-JDFZ 2019级 蒟蒻OIer:字典树(Trie)详解

代码

class Trie {
private:
    unordered_map<string, Trie*> children;
    int fid = -1; // fid != -1时,表示此节点为某字符串的终点,存储当前字符串在folder中的idx,方便取出整个字符串

public:
    vector<string> split(string &str) { // 将str中'/'去掉,将str分为一个个节点
        vector<string> res;
        int len = str.length();
        int l = 1, r = str.find_first_of('/', l); // 从idx=l开始,查询'/'下标
        while (r != string::npos) {
            res.push_back(str.substr(l, r - l));
            l = r + 1;
            r = str.find_first_of('/', l);
        }
        res.push_back(str.substr(l));
        return res;
    }

    void insert(int fid, string &str) {
        Trie* node = this; // 方便后续节点插入操作
        vector<string> ps = split(str);
        for (auto &c : ps) {
            if (!node->children.count(c)) { // 该子节点未被加入到trie中
                node->children[c] = new Trie();
            }
            node = node->children[c]; // 变更父节点,从而插入下一个节点
        }
        node->fid = fid; // 到达该字符串终点,设置fid
    }

    vector<string> search(vector<string>& folder) {
        vector<string> ans;
        function<void(Trie*)> dfs = [&](Trie* root) { //function<>特性 + lambda表达式
            if (root->fid != -1) { // 到达该分支第一个字符串终点,后面为该文件目录的子文件夹
                ans.push_back(folder[root->fid]);
                return;
            }
            for (auto& [str, child] : root->children) dfs(child);
        };
        dfs(this);
        return ans;
    }
};

class Solution {
public:
    vector<string> removeSubfolders(vector<string>& folder) {
        Trie* trie = new Trie();
        for (int i = 0; i < folder.size(); i ++ ) {
            trie->insert(i, folder[i]);
        }
        return trie->search(folder);
    }
};

复杂度分析

时间复杂度:\(O(n * m),n = folder.length(),m = max(folder[0...n-1].length())\);
空间复杂度:\(O(n * m)\)。

标签:文件夹,fid,删除,1233,vector,str,ans,folder
From: https://www.cnblogs.com/lxycoding/p/17297222.html

相关文章

  • RMAN删除过期备份或非过期备份
    (一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RMAN资料库(RMANRepository)中生成RMAN备份记录,默认情况下RMAN备份记录会被存放在目标数据库的控制文件中,如果配置了恢复目录(RecoveryCatalog),那么该备份记录也会被存放到恢复目录中。R......
  • 删除重复元素
    linkcode#include<iostream>#include<unordered_map>usingnamespacestd;intmain(){ unordered_map<char,int>mp; strings; cin>>s; for(inti=0;i<s.size();i++){ mp[s[i]]++; } stringtp=""; for(inti......
  • Windows更换笔记本电脑需要迁移和删除的内容清单
    一、需要迁移的内容清单1、桌面和磁盘中重要的文件或者文件夹2、chrome、Edge等浏览器的书签,可以导出3、常用的软件安装包(1)、输入法(百度、或者搜狗)(2)、浏览器(Chrome浏览器)(3)、WPS(4)、微信、QQ、钉钉(5)、腾讯会议(6)、百度网盘4、IT编程常用软件(1)、JDK、Python(2)、IntelliJI......
  • 文件夹批量改名工具,将首写字母改为大写
    怎么处理文件,比如快速修改文件夹名称,将首写字母改为大写?不知道如何操作的宝贝们,下面请随小编一起来试试吧,希望能给大家带来帮助。所需工具一台电脑文件夹素材若干操作步骤步骤1:在处理之前,最好将需要修改的文件夹都保存在同一个文件夹之中,方便提取步骤2:进入【文件批量改名高手】,单击......
  • 带删除按钮的ListView
    不用说了,上图先:importjava.util.ArrayList;importcom.ql.adapter.DeletableAdapter;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;impo......
  • threejs_交互_鼠标点击_添加物体_删除物体
    click点击添加物体,shirft+click点击删除物体<!DOCTYPEhtml><htmllang="en"><head> <metacharset="utf-8"> <title>three.jswebgl-interactive-voxelpainter</title> <metaname="viewport"conten......
  • 代码随想录Day22-Leetcode235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,4
    235.二叉搜索树的最近公共祖先题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/又玩了一天,手又生疏了好多;这道题看了题解,先用公共解法了,之前的题没刷,就给现在留坑了/***Definitionforabinarytreenode.*functionTree......
  • Android中asset文件夹和raw文件夹区别
    res/raw和assets的相同点:1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。res/raw和assets的不同点:1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java......
  • Spartacus 项目中的 facade 和 core 文件夹
    Spartacus是SAPCommerceCloud的storefront框架,feature-libs文件夹下的facade文件夹和core文件夹是Spartacus中用于实现特定功能的库文件夹。它们各自的作用如下:facade文件夹:存放与storefront框架中的各种功能和业务逻辑相关的代码。这些代码通过facade模式......
  • Linux下使用rm删除文件,并排除指定文件
    rm是我们在Linux下删除文件经常用到的命令,但是有时候我们目录下有很多个文件想要删除,偏偏却要保留其中1个或几个文件,那怎么办呢?很多新手朋友可能会采取一个一个文件删除的方法来操作,但是如果文件很多呢?删到啥时候啊~~ 今天我们就来教大家使用rm命令删除文件的时候如何排除指定......