Leetcode Top Interview ✨
GithubLinkedinXOfficial Website
  • Leetcode Top Interview 🎯
  • Guide to Calculating Algorithm Complexity 🚀
  • Topic 1 Array - String
    • 88. Merge Sorted Arrays 🧩
    • 27. Remove Element 🧹
    • 26. Remove Duplicates from Sorted Array 🚫
    • 80. Remove Duplicates from Sorted Array II 🚫🚫
    • 169. Majority Element 👑
    • 189. Rotate Array 🔄
    • 121. Best Time to Buy and Sell Stock 📈
    • 122. Best Time to Buy and Sell Stock II 📈💰
    • 55. Jump Game 🏃‍♂️
    • 45. Jump Game II 🏃‍♂️
    • 274. H-Index 📊
    • 380. Insert Delete GetRandom O(1) 🎲
    • 238. Product of Array Except Self 🔄
    • 134. Gas Station ⛽
    • 135. Candy 🍬
    • 42. Trapping Rain Water 🌧️
    • 13. Roman to Integer 🔢
    • 018 Integer to Roman
    • 58. Length of Last Word 🔠
    • 14. Longest Common Prefix 🌱
    • 151. Reverse Words in a String 🔄
    • 6. Zigzag Conversion 🔀
    • 28. Find the Index of the First Occurrence in a String 🔄
    • 68. Text Justification 🔄
  • Topic 2 Two Pointers
    • 125. Valid Palindrome 🚦
    • 392. Is Subsequence 📏
    • 167. Two Sum II - Input Array Is Sorted 🔍
    • 11. Container With Most Water 🏞️
    • 15. 3Sum 🌐
  • Topic 3 Sliding Window
    • 209. Minimum Size Subarray Sum 🌐
    • 3. Longest Substring Without Repeating Characters 🌐
    • 30. Substring with Concatenation of All Words 🌐
    • 76. Minimum Window Substring 🌐
  • Topic 4 Matrix
    • 36. Valid Sudoku 🌐
    • 54. Spiral Matrix 🌐
    • 48. Rotate Image 🔄
    • 73. Set Matrix Zeroes
    • 289. Game of Life 🖼️
  • Topic 5 Hashmap
    • 383. Ransom Note 🔍
    • 205. Isomorphic Strings 🔍
    • 290. Word Pattern 🧩
    • 242. Valid Anagram 🎢
    • 49. Group Anagrams 🤹‍♂️
    • 1. Two Sum 🔍
    • 202. Happy Number 🤩
    • 219. Contains Duplicate II 🔍
    • 128. Longest Consecutive Sequence 🔍
  • Topic 6 Intervals
    • 228. Summary Ranges 📊
    • 56. Merge Intervals 🔀
    • 57. Insert Interval 🆕
    • 452. Minimum Number of Arrows to Burst Balloons 🎈
  • Topic 7 Stack
    • 20. Valid Parentheses 🔍
    • 71. Simplify Path 🗺️
    • 155. Min Stack 🗃️
    • 150. Evaluate Reverse Polish Notation 🧠💻
    • 224. Basic Calculator 🧮
  • Topic 8 Linked List
    • 141. Linked List Cycle 🔁
    • 2. Add Two Numbers 🔢
    • 21. Merge Two Sorted Lists 🔗
    • 138. Copy List with Random Pointer 🔗
    • 92. Reverse Linked List II 🔄
      • Let’s explain step by step 🐇
    • 25. Reverse Nodes in k-Group 🔄
    • 19. Remove Nth Node From End of List 🗑️
    • 82. Remove Duplicates from Sorted List II ❌🔢
    • 61. Rotate List 🔄
    • 86. Partition List 🔗
    • 146. LRU Cache 🔗
  • Topic 9 Binary Tree General
    • 104. Maximum Depth of Binary Tree 🔗
    • 100. Same Tree 🔗
    • 226. Invert Binary Tree 🔗
    • 101. Symmetric Tree 🔗
    • 105. Construct Binary Tree from Preorder and Inorder Traversal 🔗
    • 106. Construct Binary Tree from Inorder and Postorder Traversal 🔗
    • 117. Populating Next Right Pointers in Each Node II 🔗
    • 114. Flatten Binary Tree to Linked List 🔗
    • 112. Path Sum 🔗
    • 129. Sum Root to Leaf Numbers 🔗
      • What_is_DFS
    • 124. Binary Tree Maximum Path Sum 🔗
Powered by GitBook
On this page
  • Problem Statement 📜
  • Examples 🌟
  • Constraints ⚙️
  • Solution 💡
  • Java Solution
  • Explanation of the Solution
  • Time Complexity ⏳
  • Space Complexity 💾

Was this helpful?

  1. Topic 7 Stack

71. Simplify Path 🗺️

Previous20. Valid Parentheses 🔍Next155. Min Stack 🗃️

Last updated 4 months ago

Was this helpful?

Difficulty: Medium - Tags: Stack, String


Problem Statement 📜

Given an absolute path for a Unix-style file system, which begins with a slash '/', transform this path into its simplified canonical path.

In Unix-style file systems:

  • A single period '.' signifies the current directory.

  • A double period '..' denotes moving up one directory level.

  • Multiple slashes '//' are interpreted as a single slash '/'.

The simplified canonical path should:

  1. Start with a single slash '/'.

  2. Separate directories with a single slash '/'.

  3. Not end with a slash '/' (unless it is the root directory).

  4. Exclude any single or double periods.


Examples 🌟

🔹 Example 1:

Input:

path = "/home/"

Output:

"/home"

🔹 Example 2:

Input:

path = "/home//foo/"

Output:

"/home/foo"

🔹 Example 3:

Input:

path = "/home/user/Documents/../Pictures"

Output:

"/home/user/Pictures"

🔹 Example 4:

Input:

path = "/../"

Output:

"/"

🔹 Example 5:

Input:

path = "/.../a/../b/c/../d/./"

Output:

"/.../b/d"

Constraints ⚙️

  • 1 <= path.length <= 3000

  • path consists of English letters, digits, period '.', slash '/', or underscore '_'.

  • path is a valid absolute Unix path.


Solution 💡

To solve the problem, a stack can be used to process directory names:

  1. Split the path by '/' to handle each component.

  2. Ignore empty strings, '.', and handle '..' by popping the stack (if not empty).

  3. Push valid directory names onto the stack.

  4. Construct the canonical path by joining stack elements with '/'.


Java Solution

import java.util.Stack;

class Solution {
    public String simplifyPath(String path) {
        Stack<String> stack = new Stack<>();
        String[] components = path.split("/");

        // Step 1: Process each component
        for (String component : components) {
            if (component.isEmpty() || component.equals(".")) {
                // Ignore empty or current directory components
                continue;
            } else if (component.equals("..")) {
                // Move up one directory level
                if (!stack.isEmpty()) {
                    stack.pop();
                }
            } else {
                // Push valid directory names
                stack.push(component);
            }
        }

        // Step 2: Construct the simplified path
        StringBuilder result = new StringBuilder();
        for (String dir : stack) {
            result.append("/").append(dir);
        }

        return result.length() > 0 ? result.toString() : "/";
    }
}

Explanation of the Solution

  1. Splitting the Path:

    • Split the path into components by '/' to isolate directories, '.', and '..'.

  2. Using a Stack:

    • Push valid directory names onto the stack.

    • Pop the stack for '..' to move up a directory level.

    • Ignore '.' and empty components.

  3. Constructing the Canonical Path:

    • Join stack elements with '/' to create the simplified path.

    • If the stack is empty, return '/' as the root directory.


Time Complexity ⏳

  • O(n): Where n is the length of the input path. Each component is processed once.

Space Complexity 💾

  • O(n): In the worst case, the stack contains all components of the path.

You can find the full solution .

LeetCode Problem Link
here