## 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.