Fork me on GitHub

Design In-Memory File System

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);
    */