删除子文件夹

https://leetcode-cn.com/problems/remove-sub-folders-from-the-filesystem/.
C++
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

[https://leetcode-cn.com/problems/remove-sub-folders-from-the-filesystem](https://www.csdn.net/). @[TOC](删除子文件夹)

基本思想

思路很简单,但是没有马上想到。先对文件夹字符串从小到大排序,因为如果一个文件夹路径path1是另一个文件夹路径path2的字文件夹的话,那么path2一定比path1要短(小)。排序后,依次判断当前文件夹的前面的路路径是不是已经在结果集中存在,如果存在,则说明当前文件夹是结果集中某一个文件夹得子文件夹,否则不是,则需要将当前文件夹添加到结果集中。

代码

class Solution {
public:
    vector<string> removeSubfolders(vector<string>& folder) {
        	unordered_set<string> pre;
    //	if(!folder.size()) return res;
    	//留下来的文件夹不是其他文件夹的子文件夹,所以,长度短的有可能是要留下来的文件
		//文件夹从小到大排序
		sort(folder.begin(),folder.end());
    	// res保存要留下来的文件夹 
    	int sz=folder.size(),j;
    	//从小的文件夹开始,每次判断当前文件夹是不是res中的一个子文件夹,如果是,跳过,判断下一个文件夹;如果不是res中的一个子文件夹,则将当前文件夹添加到结果集
		//现在的问题是,如何判断当前文件夹是不是结果集中的一个子文件夹:
		//判断准则:每次取当前文件夹的前面路径,看能不能在res结果集中找到 
    	for(int i=0;i<sz;i++){
    		string path=folder[i];
    		j=1;
    		while(j<path.size()){//每次取当前文件夹的前面路径,判断是不是和结果集中的文件夹相同 
    			while(j<path.size()&&path[j]!='/') j++;
    			if(pre.find(path.substr(0,j))!=pre.end()) break;
    			j++;//当前字符为'\',所以要j++,以便进一步判断当前路径更深的路径 
			}
    		if(j>=path.size()){//当前文件夹不是结果集中的子文件夹,添加到结果集中 
    			pre.insert(path);
			}
    	//	cout<<*(pre.begin())<<endl;
		}
		vector<string> res(pre.begin(),pre.end());
		return res; 
    }
};

总结

对 unordered_set的用法不是很熟悉,可以参考其他博主的介绍:http://c.biancheng.net/view/7250.html.
没有想到先对文件夹排序。
编程路上,砥砺前行~

上一篇:【Java之轨迹】第六章:IO流 —— File 文件基本操作(删除文件夹、模糊查找)


下一篇:实用主义 | 十行代码实现杂乱文件自动分类