1. 程式人生 > >LeetCode:簡化路徑【71】

LeetCode:簡化路徑【71】

恰恰 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】