首页 > 代码库 > [leetcode] Simplify Path

[leetcode] Simplify Path

题目:(Stack, String)

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".
题解:
主要是对路径简化定义的了解:
引用http://www.cnblogs.com/springfor/p/3869666.html

这是一道简化路径的题,路径简化的依据是:

当遇到“/../"则需要返回上级目录,需检查上级目录是否为空。

当遇到"/./"则表示是本级目录,无需做任何特殊操作。 

当遇到"//"则表示是本级目录,无需做任何操作。

当遇到其他字符则表示是文件夹名,无需简化。

当字符串是空或者遇到”/../”,则需要返回一个"/"。

当遇见"/a//b",则需要简化为"/a/b"。

 

根据这些要求,我需要两个栈来解决问题。

先将字符串依"/"分割出来,然后检查每个分割出来的字符串。

当字符串为空或者为".",不做任何操作。

当字符串不为"..",则将字符串入栈。

当字符串为"..", 则弹栈(返回上级目录)。

 

参考别人的答案:
public class Solution {    public String simplifyPath(String path) {        if(path==null||path.length()==0)           return path;                   Stack<String> stack = new Stack<String>();        String [] s = path.split("/");                for (int i=0; i<s.length; i++)        {            if(s[i].length()==0||s[i].equals("."))               continue;            else if(!s[i].equals(".."))               stack.push(s[i]);            else            {                if(!stack.isEmpty())                   stack.pop();            }        }                Stack<String> temp = new Stack<String>();                while(!stack.isEmpty())             temp.push(stack.pop());                     StringBuffer result = new StringBuffer();                while(!temp.isEmpty())            result.append("/"+temp.pop());            if(result.length()==0)           result.append("/");                   return result.toString();    }}

 

[leetcode] Simplify Path