All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0001_0100.s0071_simplify_path.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0001_0100.s0071_simplify_path;

// #Medium #String #Stack #2023_08_11_Time_2_ms_(99.80%)_Space_41.7_MB_(99.37%)

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * 71 - Simplify Path\.
 *
 * Medium
 *
 * Given a string `path`, which is an **absolute path** (starting with a slash `'/'`) to a file or directory in a Unix-style file system, convert it to the simplified **canonical path**.
 *
 * In a Unix-style file system, a period `'.'` refers to the current directory, a double period `'..'` refers to the directory up a level, and any multiple consecutive slashes (i.e. `'//'`) are treated as a single slash `'/'`. For this problem, any other format of periods such as `'...'` are treated as file/directory names.
 *
 * The **canonical path** should have the following format:
 *
 * *   The path starts with a single slash `'/'`.
 * *   Any two directories are separated by a single slash `'/'`.
 * *   The path does not end with a trailing `'/'`.
 * *   The path only contains the directories on the path from the root directory to the target file or directory (i.e., no period `'.'` or double period `'..'`)
 *
 * Return _the simplified **canonical 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 absolute Unix path.
**/
public class Solution {
    public String simplifyPath(String path) {
        Deque stk = new ArrayDeque<>();
        int start = 0;
        while (start < path.length()) {
            while (start < path.length() && path.charAt(start) == '/') {
                start++;
            }
            int end = start;
            while (end < path.length() && path.charAt(end) != '/') {
                end++;
            }
            String s = path.substring(start, end);
            if (s.equals("..")) {
                if (!stk.isEmpty()) {
                    stk.pop();
                }
            } else if (!s.equals(".") && !s.equals("")) {
                stk.push(s);
            }
            start = end + 1;
        }
        StringBuilder ans = new StringBuilder();
        while (!stk.isEmpty()) {
            ans.insert(0, stk.pop());
            ans.insert(0, "/");
        }
        return ans.length() > 0 ? ans.toString() : "/";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy