LeetCode 71.簡化路徑

LeetCode 71.簡化路徑

題目描述:

以 Unix 風格給出一個文件的絕對路徑,你須要簡化它。或者換句話說,將其轉換爲規範路徑。在 Unix 風格的文件系統中,一個點(.)表示當前目錄自己;此外,兩個點 (..) 表示將目錄切換到上一級(指向父目錄);二者均可以是複雜相對路徑的組成部分。更多信息請參閱:Linux / Unix中的絕對路徑 vs 相對路徑code

請注意,返回的規範路徑必須始終以斜槓 / 開頭,而且兩個目錄名之間必須只有一個斜槓 /。最後一個目錄名(若是存在)不能以 / 結尾。此外,規範路徑必須是表示絕對路徑的最短字符串。隊列

思想:

可能有點複雜,我採用了兩個雙端隊列,第一個負責對路徑進行處理,去掉路徑中的"/",將處理好的字符串存儲在第一個隊列中,每個目錄對應一個字符串,而後對一個字符串進行訪問,當不是".." 或"."時,將這個路徑彈出,放入第二個隊列中,當是".." 且第二個隊列不爲空時,彈出第二個隊列的隊尾元素;當爲其餘狀況時,進行下一次循環。最後第二個隊列就爲簡化後的路徑,將其分別彈出而後加上"/"就行。leetcode

代碼:

class Solution {
public:
    string simplifyPath(string path) {
        deque<string> que1;
        deque<string> que2;
        for(int i = 0; i < path.size(); i++){
            string temp;
            while(path[i] == '/' && i < path.size()) { i++; }
            while(path[i] != '/' && i < path.size()) {
                temp += path[i];
                i++;
            }
            if(!temp.empty()) {que1.push_back(temp);};
        }
        while(!que1.empty()){
            string temp = que1.front();
            que1.pop_front();
            if(temp != "." && temp != "..") { que2.push_back(temp); }
            else if(temp == "." ) { continue; }
            else if(temp == ".." && !que2.empty()){
                que2.pop_back();
            }
            else { continue; }
            
        }
        cout << "-------" << endl;
        string res = "/";
        while(!que2.empty()) {
            res += que2.front();
            que2.pop_front();
            res += "/";
        }
        if(res.size() != 1) { res.erase(res.end() - 1); }
        return res;
    }
};
相關文章
相關標籤/搜索