Simplify Path

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

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

click to show corner cases.

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

ref:http://fisherlei.blogspot.com/2013/01/leetcode-simplify-path.html

[解题思路]

利用栈的特性,如果sub string element

1. 等于“/”,跳过,直接开始寻找下一个element

2. 等于“.”,什么都不需要干,直接开始寻找下一个element

3. 等于“..”,弹出栈顶元素,寻找下一个element

4. 等于其他,插入当前elemnt为新的栈顶,寻找下一个element

最后,再根据栈的内容,重新拼path。这样可以避免处理连续多个“/”的问题。

public class Solution {
    public String simplifyPath(String path) {
        ArrayList<String> sta=new ArrayList<String>();
        String[] paths=path.split("/");
        for(int i=0;i<paths.length;i++){
            String cur=paths[i];
            switch(cur){
                case "/":break;
                case ".":break;
                case "":break;
                case "..":
                    if(sta.size()!=0){
                        sta.remove(sta.size()-1);
                    }
                    break;
                default:
                    sta.add(cur);
            }
        }
        
        StringBuffer ret=new StringBuffer();
        for(int i=0;i<sta.size();i++){
            ret.append("/");
            ret.append(sta.get(i));
        }
        
        if(sta.size()==0)return "/";
        return ret.toString();
    }
}
原文地址:https://www.cnblogs.com/RazerLu/p/3552545.html