LeetCode:簡化路徑【71】
阿新 • • 發佈:2018-11-10
恰恰 solution 包含 忽略 public 元素 ava 一個 是否 將他們拼接成答案即可。
LeetCode:簡化路徑【71】
題解參考天碼營:https://www.tianmaying.com/tutorial/LC71
題目描述
給定一個文檔 (Unix-style) 的完全路徑,請進行路徑簡化。
例如,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
邊界情況:
- 你是否考慮了 路徑 =
"/../"
的情況?
在這種情況下,你需返回"/"
。 - 此外,路徑中也可能包含多個斜杠
‘/‘
,如"/home//foo/"
。
在這種情況下,你可忽略多余的斜杠,返回"/home/foo"
。
題目分析
對於這道題目來說,最為關鍵的算法就是如何處理".."對於之前路徑的“退回”操作 。不難發現,每次“退回”的都是當前路徑中的最後一個“文件夾”,每次進入的文件夾也都會出現在路徑的最後。這樣的一個“從一段添加或者刪除”的模式恰恰就是棧的定義。
當我們知道要使用棧結構以後,還有幾個坑需要註意:
- ""和"."都是不需要處理的
- /,//,///,只要是連續的斜線都是/
- 在根目錄是使用".."是無法退後的,這TMD巨坑,結合實際了!
我們處理的步驟是如下:
- 如果當前段是
..
,則看stack中是否有元素,如果有,刪除最後一個 - 如果當前段是
.
或者,則不做任何處理
- 否則將當前段加入到stack的末尾
這樣,在處理完所有段之後,我們就可以確保仍然在stack中的就是最簡單的路徑字符串了,這個時候,我們只需要使用/
Java題解
class Solution { public String simplifyPath(String path) { Stack<String> stringStack = new Stack<>(); String[] arr = path.split("/"); for(String str:arr) { if(str.equals("")||str.equals(".")) continue; if(str.equals("..")) { if(!stringStack.empty()) stringStack.pop(); } else stringStack.push(str); } String ans = ""; while (!stringStack.empty()) { ans="/"+stringStack.pop()+ans; } if(ans.equals("")) return "/"; return ans; } }
LeetCode:簡化路徑【71】