1. 程式人生 > >Leetcode 71 簡化路徑simplify-path(棧)

Leetcode 71 簡化路徑simplify-path(棧)

font 出錯 標準 多個 push ac代碼 -s cpp mark

給定一個文檔 (Unix-style) 的完全路徑,請進行路徑簡化。

例如,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

邊界情況:

    • 你是否考慮了 路徑 = "/../" 的情況?
      在這種情況下,你需返回 "/"
    • 此外,路徑中也可能包含多個斜杠 ‘/‘ ,如 "/home//foo/"
      在這種情況下,你可忽略多余的斜杠,返回 "/home/foo"

=============================================================

可得到路徑簡化規則:

  1. 末尾‘/’刪除;
  2. 不重復出現‘/’;
  3. ‘/./’刪除;
  4. ‘/../’連並前個路徑一起刪除;

思路:可以根據‘/‘把路徑分割成多個元素,根據規則壓入棧中,最後用‘/’拼接;

首先是分割,不想python等的高級語言有split可以直接分割;但是可以用stringstream+getline實現分割功能;

按規則壓入棧中:遇到‘.’不處理,遇到‘..’ pop;其他元素push;

下面是AC代碼:

class Solution {
public:
    
    string simplifyPath(string path) {
        vector <string> mark;
        
string s; stringstream ss(path); string result; while(getline(ss,s,/)){ //使用stringstream和getline 實現分割功能。 if(s=="."||s=="") //如果不加入 ""會出錯,存在空字符?! continue; else if(s==".." && !mark.empty()) //註意空棧的情況! mark.pop_back();
else if(s!="..") mark.push_back(s); } for(string sss:mark){ result+="/"+sss; } if(mark.empty())return "/"; return result; } }; //用stack不能用cpp11標準的for(:) //vector卻可以。。。
//why??求大神解答

Leetcode 71 簡化路徑simplify-path(棧)