https://leetcode-cn.com/problems/remove-sub-folders-from-the-filesystem/.
C++
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基本思想
思路很简单,但是没有马上想到。先对文件夹字符串从小到大排序,因为如果一个文件夹路径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.
没有想到先对文件夹排序。
编程路上,砥砺前行~