package string; import java.util.ArrayDeque; import java.util.Deque; import java.util.StringTokenizer; /** * Created by gouthamvidyapradhan on 28/07/2017. * *

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". */ public class SimplifyPath { /** * Main method * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { System.out.println(new SimplifyPath().simplifyPath("/home/")); } public String simplifyPath(String path) { if (path == null || path.isEmpty()) return "/"; StringTokenizer st = new StringTokenizer(path, "/"); Deque dQueue = new ArrayDeque<>(); while (st.hasMoreTokens()) { String token = st.nextToken(); if (token.trim().equals("..")) { if (!dQueue.isEmpty()) dQueue.pop(); } else if (token.trim().equals(".")) { // ignore } else dQueue.push(token); } if (dQueue.isEmpty()) return "/"; StringBuilder finalStr = new StringBuilder(); while (!dQueue.isEmpty()) { finalStr.append("/").append(dQueue.removeLast()); } return finalStr.toString(); } }