[leetcode] Simplify Path

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

Corner Cases:

 

    • Did you consider the case where path = "/../"?
      In this case, you should return "/".
    • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
      In this case, you should ignore redundant slashes and return "/home/foo".

https://oj.leetcode.com/problems/simplify-path/

 

思路:先按'/'分割路径,存入一个stack中,注意遇到'.'和空字符要忽略,遇到'..'要pop,正常路径push,最后依次pop组合成结果。

import java.util.Stack;

public class Solution {
    public String simplifyPath(String path) {
        if (path == null || path.length() == 0)
            return path;
        Stack<String> stack = new Stack<String>();
        String[] oldPaths = path.split("/");
        for (String each : oldPaths) {
            if (each.equals(""))
                continue;
            if (each.equals("."))
                continue;
            if (each.equals("..")) {
                if (!stack.isEmpty())
                    stack.pop();
            } else {
                stack.push(each);
            }

        }
        if (stack.isEmpty())
            return "/";

        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) {
            sb.append(new StringBuffer(stack.pop()).reverse().toString());
            sb.append("/");
        }

        return sb.reverse().toString();
    }

    public static void main(String[] args) {
        System.out.println(new Solution().simplifyPath("/a/./b/../../c/"));
        System.out.println(new Solution().simplifyPath("//a//b//c//"));
        System.out.println(new Solution().simplifyPath("/home/.//aa/.././"));
        System.out.println(new Solution().simplifyPath("/../..//.././/."));

    }
}
View Code

 

 

posted @ 2014-06-27 19:36  jdflyfly  阅读(179)  评论(0编辑  收藏  举报