LeetCode-071-简化路径

简化路径

题目描述:给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
【LeetCode-071-简化路径】始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名(如果存在)不能 以 '/' 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
返回简化后得到的 规范路径 。
示例说明请见LeetCode官网。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:利用栈
声明一个栈paths用来存出现过的目录,然后遍历path的字符,获取每一个/之间的字符串str,str有以下几种可能:
  • 如果str是 .,则不用处理;
  • 如果str是..,而且paths不为空,则paths抛弃栈顶元素即最外层目录;
  • 如果str不是以上两种情况,则说明str是一个目录,入栈。
最后,将paths倒序排列,然后拼成目录格式返回。
import java.util.Stack; public class LeetCode_071 { public static String simplifyPath(String path) { Stack paths = new Stack<>(); String str = ""; for (char c : path.toCharArray()) { if (c == '/') { if (str.length() != 0) { if (str.equals(".")) { } else if (str.equals("..")) { if (!paths.isEmpty()) { paths.pop(); } } else { paths.push(str); } str = ""; } } else { str += c; } } if(str.length() != 0) { if (str.equals(".")) { } else if (str.equals("..")) { if (!paths.isEmpty()) { paths.pop(); } } else { paths.push(str); } } if (paths.isEmpty()) { return "/"; } Stack reversePaths = new Stack<>(); while (!paths.isEmpty()) { reversePaths.push(paths.pop()); } String result = ""; while (!reversePaths.isEmpty()) { result += "/" + reversePaths.pop(); } return result; }public static void main(String[] args) { System.out.println(simplifyPath("/a//b////c/d//././/..")); } }

【每日寄语】 成功的道路是由目标铺成的,大目标比没目标有用,小目标比大目标有用,现在不玩命,将来命玩你。

    推荐阅读