前言:
作者:神的孩子在歌唱
一個算法小菜雞
大家好,我叫智
71. 簡化路徑
給你一個字符串 path
,表示指向某一文件或目錄的 Unix 風格 絕對路徑 (以 '/'
開頭),請你將其轉化為 更加簡潔的規范路徑。
在 Unix 風格的文件系統中規則如下:
- 一個點
'.'
表示當前目錄本身。 - 此外,兩個點
'..'
表示將目錄切換到上一級(指向父目錄)。 - 任意多個連續的斜杠(即,
'//'
或'///'
)都被視為單個斜杠'/'
。 - 任何其他格式的點(例如,
'...'
或'....'
)均被視為有效的文件/目錄名稱。
返回的 簡化路徑 必須遵循下述格式:
- 始終以斜杠
'/'
開頭。 - 兩個目錄名之間必須只有一個斜杠
'/'
。 - 最后一個目錄名(如果存在)不能 以
'/'
結尾。 - 此外,路徑僅包含從根目錄到目標文件或目錄的路徑上的目錄(即,不含
'.'
或'..'
)。
返回簡化后得到的 規范路徑 。
示例 1:
**輸入:**path = “/home/”
輸出:“/home”
解釋:
應刪除尾隨斜杠。
示例 2:
**輸入:**path = “/home//foo/”
輸出:“/home/foo”
解釋:
多個連續的斜杠被單個斜杠替換。
示例 3:
**輸入:**path = “/home/user/Documents/…/Pictures”
輸出:“/home/user/Pictures”
解釋:
兩個點 ".."
表示上一級目錄(父目錄)。
示例 4:
**輸入:**path = “/…/”
輸出:“/”
解釋:
不可能從根目錄上升一級目錄。
示例 5:
**輸入:**path = “/…/a/…/b/c/…/d/./”
輸出:“/…/b/d”
解釋:
"..."
在這個問題中是一個合法的目錄名。
提示:
1 <= path.length <= 3000
path
由英文字母,數字,'.'
,'/'
或'_'
組成。path
是一個有效的 Unix 風格絕對路徑。
思路 : 通過棧進行遍歷,有效值才入棧
class Solution {// 通過棧進行遍歷,有效值才入棧// 如何找到有效值:遍歷到當前/,下一個/public String simplifyPath(String path) {// 定義棧Deque<String> stack = new ArrayDeque<>();int len=path.length();for(int i=1;i<len;i++){// 如果當前是/就跳過if(path.charAt(i)=='/') continue;// 否者就開始遍歷值,我們這里先循環到下一個/的位置int j=i+1;while(j<len&&path.charAt(j)!='/') j++;// 通過substring切割獲取值String item=path.substring(i,j);// 將i放入到j的位置i=j;// 如果是..就出棧if(item.equals("..")){// 如果不為空if(!stack.isEmpty()){stack.pollLast();}}// 否則如果item不為.else if(!item.equals(".")){stack.addLast(item);}}StringBuilder s=new StringBuilder();while(!stack.isEmpty()){s.append('/'+stack.pollFirst());}return s.length()==0?"/":s.toString();}
}
本人csdn博客:https://blog.csdn.net/weixin_46654114
轉載說明:跟我說明,務必注明來源,附帶本人博客連接。