You are given an absolute path for a Unix-style file system, which always begins with a slash '/'
. Your task is to transform this absolute path into its simplified canonical path.
The rules of a Unix-style file system are as follows:
'.'
represents the current directory.'..'
represents the previous/parent directory.'//'
and '///'
are treated as a single slash '/'
.'...'
and '....'
are valid directory or file names.The simplified canonical path should follow these rules:
'/'
.'/'
.'/'
, unless it is the root directory.'.'
and '..'
) used to denote current or parent directories.Return the simplified canonical path.
Example 1:
Input: path = "/home/"
Output: "/home"
Explanation:
The trailing slash should be removed.
Example 2:
Input: path = "/home//foo/"
Output: "/home/foo"
Explanation:
Multiple consecutive slashes are replaced by a single one.
Example 3:
Input: path = "/home/user/Documents/../Pictures"
Output: "/home/user/Pictures"
Explanation:
A double period ".."
refers to the directory up a level (the parent directory).
Example 4:
Input: path = "/../"
Output: "/"
Explanation:
Going one level up from the root directory is not possible.
Example 5:
Input: path = "/.../a/../b/c/../d/./"
Output: "/.../b/d"
Explanation:
"..."
is a valid name for a directory in this problem.
Constraints:
1 <= path.length <= 3000
path
consists of English letters, digits, period '.'
, slash '/'
or '_'
.path
is a valid absolute Unix path.When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
The brute force method for simplifying a file path involves exploring all possible interpretations of the given path. We systematically go through each part of the path, considering all options for handling special components like '.', '..', and multiple slashes. This approach explores every possible path transformation until a simplified version is found.
Here's how the algorithm would work step-by-step:
def simplify_path(path): path_parts = path.split('/')
stack = []
for part in path_parts:
# Ignore empty strings or current directory references
if part == '' or part == '.':
continue
# Handle moving up a directory level
if part == '..':
if stack:
stack.pop()
# Add the directory to the stack
else:
stack.append(part)
# Construct the simplified path
simplified_path = '/' + '/'.join(stack)
# Ensure the path is not just '/', which should represent the root
if not simplified_path:
return '/'
return simplified_path
The goal is to clean up a file path, like removing extra slashes and going back directories. We can use a simple way to keep track of only the important parts of the path and ignore the rest. This approach will give us the shortest, most correct path.
Here's how the algorithm would work step-by-step:
def simplify_path(path):
path_components = path.split('/')
stack_of_directories = []
for component in path_components:
if component == '' or component == '.':
continue
if component == '..':
# Handle '..' by popping from the stack if it's not empty
if stack_of_directories:
stack_of_directories.pop()
else:
# Add valid directory names to the stack
stack_of_directories.append(component)
# Construct the simplified path
simplified_path = '/' + '/'.join(stack_of_directories)
return simplified_path
Case | How to Handle |
---|---|
Null or empty input path string | Return a single forward slash '/' representing the root directory. |
Path containing only '.' | Return a single forward slash '/' representing the root directory, as '.' means current directory. |
Path containing only '..' | Return a single forward slash '/' representing the root directory, as '..' from root stays at root. |
Path with multiple consecutive slashes '//' | Treat multiple consecutive slashes as a single slash, ensuring no empty directory names are pushed to stack. |
Path ending with '/.' | Ignore the '/.' at the end, effectively removing it during stack processing. |
Path with mixed valid directory names, '.' and '..' | Process each component sequentially, updating the stack appropriately for directory names, '.' and '..'. |
Path with deeply nested directories and many '..' to move up | The stack ensures correct navigation to parent directories, even when many levels deep. |
Path with trailing slashes after processing | Remove trailing slashes from the final constructed string before returning to adhere to required format. |