Wednesday, March 5, 2014

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

Solution


Not a difficult problem, but caution needs to be exercised.
Clarify:

  1. see ".", stay in the same folder
  2. see ".." go back to previous folder
Use a stack to hold folder names and their relationship


public String simplifyPath(String path) {
if(path.length()==0) return null;
if(path.charAt(0) != '/') return null;
Stack<String> stack = new Stack<String>();
StringBuilder ret = new StringBuilder();
int len = path.length();
for(int i=0; i<len; i++){
//Skip all '/', such as"/a////b"
while(i<len&&path.charAt(i)=='/') i++;//out of index error if while(path.charAt(i)=='/'&&i<len)
if(i==len) break;//!!!forgot
//collect the string before next '/'
StringBuilder sb = new StringBuilder();
while(i<len&&path.charAt(i)!= '/'){
sb.append(path.charAt(i));
i++;
}
String str = sb.toString();
if(str.equals("."))//if "." stay in the same folder
continue;
else if(str.equals("..")){//if "..", get back to upper folder
if(!stack.empty())
stack.pop();
}//forgot the {}, caused error here
else//if a folder name, go to next folder
stack.push(str);
}
if(stack.empty()) return "/";
//construct the file path based on the elements in the stack
while(!stack.empty()){
String str = stack.pop();
ret.insert(0, str);
ret.insert(0, '/');
}
return ret.toString();
}
view raw gistfile1.java hosted with ❤ by GitHub


No comments:

Post a Comment