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.