71. Simplify Path
Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the canonical path.
In a UNIX-style file system, a period '.'
refers to the current directory. Furthermore, a double period '..'
moves the directory up a level.
Note that the returned canonical path must always begin with a slash '/'
, and there must be only a single slash '/'
between two directory names. The last directory name (if it exists) must not end with a trailing '/'
. Also, the canonical path must be the shortest string representing the absolute path.
Example 1:
Input: path = "/home/" Output: "/home" Explanation: Note that there is no trailing slash after the last directory name.
Example 2:
Input: path = "/../" Output: "/" Explanation: Going one level up from the root directory is a no-op, as the root level is the highest level you can go.
Example 3:
Input: path = "/home//foo/" Output: "/home/foo" Explanation: In the canonical path, multiple consecutive slashes are replaced by a single one.
Example 4:
Input: path = "/a/./b/../../c/" Output: "/c"
Constraints:
1 <= path.length <= 3000
path
consists of English letters, digits, period'.'
, slash'/'
or'_'
.path
is a valid Unix path.
Rust Solution
struct Solution;
impl Solution {
fn simplify_path(path: String) -> String {
let mut stack: Vec<&str> = vec![];
let mut res = "".to_string();
for s in path.split_terminator('/') {
match s {
".." => {
stack.pop();
}
"" | "." => {
continue;
}
_ => {
stack.push(s);
}
}
}
for s in stack {
res += "/";
res += s;
}
if res.is_empty() {
res += "/";
}
res
}
}
#[test]
fn test() {
let path = "/home/".to_string();
let res = "/home".to_string();
assert_eq!(Solution::simplify_path(path), res);
let path = "/../".to_string();
let res = "/".to_string();
assert_eq!(Solution::simplify_path(path), res);
let path = "/home//foo/".to_string();
let res = "/home/foo".to_string();
assert_eq!(Solution::simplify_path(path), res);
let path = "/a/./b/../../c/".to_string();
let res = "/c".to_string();
assert_eq!(Solution::simplify_path(path), res);
let path = "/a/../../b/../c//.//".to_string();
let res = "/c".to_string();
assert_eq!(Solution::simplify_path(path), res);
let path = "/a//b////c/d//././/..".to_string();
let res = "/a/b/c".to_string();
assert_eq!(Solution::simplify_path(path), res);
}
Having problems with this solution? Click here to submit an issue on github.