Leetcode 71 簡化路徑simplify-path(棧)
阿新 • • 發佈:2018-09-16
font 出錯 標準 多個 push ac代碼 -s cpp mark
給定一個文檔 (Unix-style) 的完全路徑,請進行路徑簡化。
例如,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
邊界情況:
- 你是否考慮了 路徑 =
"/../"
的情況?
在這種情況下,你需返回"/"
。 - 此外,路徑中也可能包含多個斜杠
‘/‘
,如"/home//foo/"
。
在這種情況下,你可忽略多余的斜杠,返回"/home/foo"
。
=============================================================
可得到路徑簡化規則:
- 末尾‘/’刪除;
- 不重復出現‘/’;
- ‘/./’刪除;
- ‘/../’連並前個路徑一起刪除;
思路:可以根據‘/‘把路徑分割成多個元素,根據規則壓入棧中,最後用‘/’拼接;
首先是分割,不想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(棧)