题目
在一组文件路径集合中,找出那些存在子路径的集合并返回。
说明:
1.每个路径只由 / 和 小写字母结合,且不会出现多个 / 重叠的情况。
2.以 / 开头,不以 / 结尾,而且不会出现单个的 /,都会组合字母。
3.输出结果需要与原输入顺序一致
例1:
输入:'/a,/a/b,/a/c,/b/c,/b/c/d,/b/cf'
输出:'/a,/b/c'
解释:因为有 /a 及 /a/b,所以 /a 是文件夹。
因为有 /b/c 及 /b/c/d,所以 /b/c 是文件夹。/b 不存在于输入集合中
例2:
输入:'/a/c,/a/d,/x/y/z/b,/x/y,/x/y/z'
输出:'/x/y,/x/y/z'
解释:因为有 /x/y 及 /x/y/z,所以 /x/y 是文件夹。同理也有 /x/y/z/b,
所以 /x/y/z 也是文件夹。有 /a/c /a/d,但没有 /a,所以 /a 不是文件夹。
例3:
输入:'/a/b,/a/c,/b/c,/b/c/d/e,/b/ef'
输出:'/b/c'
解释:因为 /b/c 及 /b/c/d/e,所以 /b/c 是文件夹。不存在 /a 和 /b,所以这两个都不是文件夹。
例4:
输入:'/b/c,/b/cf'
输出:''
测试例子:
1.输入:'/a,/a/b,/a/c,/b/c,/b/c/d,/b/cf'。 输出:'/a,/b/c'
2.输入:'/a/c,/a/d,/x/y/z/b,/x/y,/x/y/z'。输出:'/x/y,/x/y/z'
3.输入:'/a/b,/a/c,/b/c,/b/c/d/e,/b/ef'。输出:'/b/c'
4.输入:'/b/c,/b/cf'。输出:''
5.输入:'/a'。输出:''
6.输入:'/b,/b/c,/b/c/f',输出:'/b,/b/c'
7.输入:'/x/y/a/b,/x/y/a,/x/y',输出:'/x/y/a,/x/y'
8.输入:'/',输出:''
9.输入:'//',输出:''
10.输入:'/a/c/b,/a/b,/a/c,/a,/b/c,/b/c/d,/b/cf' 输出:'/a/c,/a,/b/c'
11.输入:'/a/d,/x/a/d/y',输出: ''
function find(str) {
}
JS代码
function find(str) {
let strArr = str.split(',');
let tempArr = [...strArr];
let ans = [];
strArr = strArr.sort(function(a,b) {
return (a.length - b.length);
})
if (!(strArr.length > 1)) {
return '';
}
for(let i=0, j=strArr.length-2; i<j; i++) {
let lastItem = strArr.pop();
let temp = strArr.filter(item => {
let notEqual = item.split('/').length !== lastItem.split('/').length;
return notEqual && lastItem.includes(item);
})
ans = [... new Set([...ans, ...temp])];
}
return tempArr.filter(item => {
return ans.includes(item);
}).join(',');
}