Description
https://leetcode.com/problems/design-in-memory-file-system/description/
Solution
`
class Node {
public:
bool type; //true is file, false is directory
map<string, Node*> mapping;
string str;
string name;
Node (string fileName, bool isFile) {
name = fileName;
type = isFile;
}
};
class FileSystem {
private:
Node* root;
public:
FileSystem() {
root = new Node(“LLL”, false);
}
vector<string> ls(string path) {
int size = path.size();
Node* traverse = root;
int index = 1;
while (index < size) {
int count = 0;
while(index + count < size && path[index + count] != '/') ++count;
string target = path.substr(index, count);
index += count;
++index; //skip the '/'
auto iter = traverse->mapping.find(target);
if (iter == traverse->mapping.end()) return vector<string>();
traverse = traverse->mapping[target];
}
vector<string> ret;
//Is a file
if (traverse->type) {
ret.push_back(traverse->name);
return ret;
}
//Is a directory
for (auto item : traverse->mapping) {
ret.push_back(item.first);
}
return ret;
}
void mkdir(string path) {
int size = path.size();
if (size == 1) return;
Node* traverse = root;
int index = 1;
while (index < size) {
int count = 0;
while(index + count < size && path[index + count] != '/') ++count;
string target = path.substr(index, count);
index += count;
++index; //skip the '/'
auto iter = traverse->mapping.find(target);
if (iter == traverse->mapping.end()) traverse->mapping[target] = new Node(target, false);
traverse = traverse->mapping[target];
}
return;
}
void addContentToFile(string filePath, string content) {
int size = filePath.size();
if (size == 1) return;
Node* traverse = root;
int index = 1;
while (index < size) {
int count = 0;
while(index + count < size && filePath[index + count] != '/') ++count;
string target = filePath.substr(index, count);
index += count;
++index; //skip the '/'
auto iter = traverse->mapping.find(target);
if (iter == traverse->mapping.end()) traverse->mapping[target] = new Node(target, true); //Add a new file
traverse = traverse->mapping[target];
}
traverse->str += content;
return;
}
string readContentFromFile(string filePath) {
int size = filePath.size();
if (size == 1) return string();
Node* traverse = root;
int index = 1;
while (index < size) {
int count = 0;
while(index + count < size && filePath[index + count] != '/') ++count;
string target = filePath.substr(index, count);
index += count;
++index; //skip the '/'
traverse = traverse->mapping[target];
}
return traverse->str;
}
};
/**
- Your FileSystem object will be instantiated and called as such:
- FileSystem obj = new FileSystem();
- vector
param_1 = obj.ls(path); - obj.mkdir(path);
- obj.addContentToFile(filePath,content);
- string param_4 = obj.readContentFromFile(filePath);
*/
