LeetCode刷题笔录Simplify Path

来源:互联网 发布:js原型链的理解 编辑:程序博客网 时间:2024/05/16 10:29

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".
这题需要用到一个stack,利用"/"来分割出每一个substring。"/"本身则不做处理直接跳过,再最后构造结果string的时候再按照规则加上/,这样就可以不用管连续有很多个/的情况。

substring处理如下:

1.如果是".",什么都不做

2.如果是"..",从stack里pop出一个元素

3.如果是一般字符串,push进stack

最后把stack里的元素按照栈底到栈顶的顺序接在一起就行了。

public class Solution {    public String simplifyPath(String path) {        if(path == null || path.length() == 0)            return "";        LinkedList<String> stack = new LinkedList<String>();        char[] arr = path.toCharArray();        int i = 0;        while(i < arr.length){            if(arr[i] == '/'){                i++;                continue;            }            int start = i;            int end = start;            while(end < arr.length && arr[end] != '/')                end++;            i = end;            String sub = path.substring(start, end);                        if(sub.equals(".")){                continue;            }            else if(sub.equals("..")){                if(!stack.isEmpty())                    stack.remove(stack.size() - 1);            }            else{                stack.add(sub);            }        }                StringBuffer str = new StringBuffer("/");        if(stack.isEmpty())            return str.toString();        while(!stack.isEmpty()){            str.append(stack.pollFirst()).append("/");        }        str.deleteCharAt(str.length() - 1);        return str.toString();    }}



0 0
原创粉丝点击