?LeetCode刷題實(shí)戰(zhàn)588:設(shè)計(jì)內(nèi)存文件系統(tǒng)
ls: Given a path in string format. If it is a file path, return a list that only contains this file's name. If it is a directory path, return the list of file and directory names?in this directory. Your output (file and directory names together) should in?lexicographic order.mkdir: Given a?directory path?that does not exist, you should make a new directory according to the path. If the middle directories in the path don't exist either, you should create them as well. This function has void return type.addContentToFile: Given a?file path?and?file content?in string format. If the file doesn't exist, you need to create that file containing given content. If the file already exists, you need to?append?given content to original content. This function has void return type.readContentFromFile: Given a?file path, return its?content?in string format.示例
輸入:
["FileSystem","ls","mkdir","addContentToFile","ls","readContentFromFile"]
[[],["/"],["/a/b/c"],["/a/b/c/d","hello"],["/"],["/a/b/c/d"]]
輸出:
[null,[],null,null,["a"],"hello"]
解題
class?FileSystem?{
public:
????FileSystem() {
????????dirs["/"];
????}
????
????vector<string> ls(string?path) {
????????if?(files.count(path)) {
????????????int?idx = path.find_last_of('/');
????????????return?{path.substr(idx + 1)};
????????}
????????auto?t = dirs[path];
????????return?vector<string>(t.begin(), t.end());
????}
????
????void?mkdir(string?path)?{
????????istringstream?is(path);
????????string?t = "", dir = "";
????????while?(getline(is, t, '/')) {
????????????if?(t.empty()) continue;
????????????if?(dir.empty()) dir += "/";
????????????dirs[dir].insert(t);
????????????if?(dir.size() > 1) dir += "/";
????????????dir += t;
????????}
????}
????
????void?addContentToFile(string?filePath, string?content)?{
????????int?idx = filePath.find_last_of('/');
????????string?dir = filePath.substr(0, idx);
????????string?file = filePath.substr(idx + 1);
????????if?(dir.empty()) dir = "/";
????????if?(!dirs.count(dir)) mkdir(dir);
????????dirs[dir].insert(file);
????????files[filePath].append(content);
????}
????
????string?readContentFromFile(string?filePath)?{
????????return?files[filePath];
????}
????
private:
????unordered_map<string, set<string>> dirs;
????unordered_map<string, string> files;
};
