问题描述
你是一位系统管理员,手里有一份文件夹列表
folder
,你的任务是要删除该列表中的所有子文件夹,并以任意顺序返回剩下的文件夹。如果文件夹
folder[i]
位于另一个文件夹folder[j]
下,那么folder[i]
就是folder[j]
的 子文件夹 。文件夹的「路径」是由一个或多个按以下格式串联形成的字符串:'/' 后跟一个或者多个小写英文字母。
- 例如,
"/leetcode"
和"/leetcode/problems"
都是有效的路径,而空字符串和"/"
不是。
示例
示例 1:
输入:folder = ["/a","/a/b","/c/d","/c/d/e","/c/f"] 输出:["/a","/c/d","/c/f"] 解释:"/a/b" 是 "/a" 的子文件夹,而 "/c/d/e" 是 "/c/d" 的子文件夹。示例 2:
输入:folder = ["/a","/a/b/c","/a/b/d"] 输出:["/a"] 解释:文件夹 "/a/b/c" 和 "/a/b/d" 都会被删除,因为它们都是 "/a" 的子文件夹。示例 3:
输入: folder = ["/a/b/c","/a/b/ca","/a/b/d"] 输出: ["/a/b/c","/a/b/ca","/a/b/d"]提示:
1 <= folder.length <= 4 * 104
2 <= folder[i].length <= 100
folder[i]
只包含小写字母和'/'
folder[i]
总是以字符'/'
起始folder
每个元素都是 唯一 的
问题分析:
起初,我想着直接用哈希集合,遍历这个string数组,然后检查哈希集合里面有没有这个string元素的前缀,也就是它的父文件夹。但是在执行时出了一些问题(我不知道这个string的文件夹每一层命名有几个,然后就是巴拉巴拉一团乱麻然后放弃思考bushi),后来我就想到了,一般这种有规律的分割,直接上stringstream,没用过的伙伴们可以去看一下用法真的蛮好用的。
总之,大体思路如下:
首先对这个string数组排序(这步是为了让子文件夹一定出现在父文件夹后面),然后我们祭出我们的stringstream,注意我们通过‘/’分割string,例如/a/b/c得到的是诸如a b c这样的,我们用一个string来不断加他们然后和set里面的比,如果找到了父亲就给他删掉(这段我感觉我表达能力不如AI),最后把满足条件的加入到res数组里。(最后还需要做一些小小的处理才行,有知道原因的希望可以评论区教我一下谢谢)
代码如下:
class Solution {
public:
vector<string> removeSubfolders(vector<string>& folder) {
set<string> st;
//排序,默认升序即可
sort(folder.begin(), folder.end());
for(int i = 0; i < folder.size(); i ++)
{
istringstream ss(folder[i]);
string word;
string neww;
int flag = 0;
while(getline(ss, word, '/'))
{
//累加分割的word,迭代寻找父文件夹
neww += '/' + word;
if(st.find(neww) != st.end())
{
break;
flag = 1;
}
}
//没找到父文件夹,加入哈希集合
if(flag == 0)
{
st.insert(neww);
}
}
vector<string> res;
for(auto & s : st)
{
//最后结果莫名奇妙多个‘/’,只能删掉它了
string p = s;
p.erase(p.begin());
res.push_back(p);
}
return res;
}
};