2024-10-25 Daily Challenge
Today I have done leetcode's October LeetCoding Challenge with cpp
.
October LeetCoding Challenge 25
Description
Remove Sub-Folders from the Filesystem
Given a list of folders folder
, return the folders after removing all sub-folders in those folders. You may return the answer in any order.
If a folder[i]
is located within another folder[j]
, it is called a sub-folder of it. A sub-folder of folder[j]
must start with folder[j]
, followed by a "/"
. For example, "/a/b"
is a sub-folder of "/a"
, but "/b"
is not a sub-folder of "/a/b/c"
.
The format of a path is one or more concatenated strings of the form: '/'
followed by one or more lowercase English letters.
- For example,
"/leetcode"
and"/leetcode/problems"
are valid paths while an empty string and"/"
are not.
Example 1:
Input: folder = ["/a","/a/b","/c/d","/c/d/e","/c/f"] Output: ["/a","/c/d","/c/f"] Explanation: Folders "/a/b" is a subfolder of "/a" and "/c/d/e" is inside of folder "/c/d" in our filesystem.
Example 2:
Input: folder = ["/a","/a/b/c","/a/b/d"] Output: ["/a"] Explanation: Folders "/a/b/c" and "/a/b/d" will be removed because they are subfolders of "/a".
Example 3:
Input: folder = ["/a/b/c","/a/b/ca","/a/b/d"] Output: ["/a/b/c","/a/b/ca","/a/b/d"]
Constraints:
1 <= folder.length <= 4 * 104
2 <= folder[i].length <= 100
folder[i]
contains only lowercase letters and'/'
.folder[i]
always starts with the character'/'
.- Each folder name is unique.
Solution
struct TrieNode {
bool end = false;
TrieNode *child[128] = {};
};
void insert(TrieNode *root, const string &word) {
TrieNode *cur = root;
for(auto c : word) {
if(!cur->child[c]) {
cur->child[c] = new TrieNode();
}
cur = cur->child[c];
}
cur->end = true;
}
bool isSubFolder(TrieNode *root, const string &word) {
TrieNode *cur = root;
bool prevFolder = false;
for(auto c : word) {
if(prevFolder && c == '/') return true;
cur = cur->child[c];
prevFolder = cur->end;
}
return false;
}
class Solution {
public:
vector<string> removeSubfolders(vector<string>& folder) {
TrieNode *root = new TrieNode();
for(const auto &folder : folder) {
insert(root, folder);
}
vector<string> answer;
for(const auto &folder : folder) {
if(!isSubFolder(root, folder)) answer.push_back(folder);
}
return answer;
}
};