给你一个字符串 path
,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/‘
开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.
)表示当前目录本身;此外,两个点 (..
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//‘
)都被视为单个斜杠 ‘/‘
。 对于此问题,任何其他格式的点(例如,‘...‘
)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
‘/‘
开头。‘/‘
。‘/‘
结尾。‘.‘
或 ‘..‘
)。返回简化后得到的 规范路径 。
示例 1:
输入:path = "/home/" 输出:"/home" 解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:path = "/../" 输出:"/" 解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
示例 3:
输入:path = "/home//foo/" 输出:"/home/foo" 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:path = "/a/./b/../../c/" 输出:"/c"
提示:
1 <= path.length <= 3000
path
由英文字母,数字,‘.‘
,‘/‘
或 ‘_‘
组成。path
是一个有效的 Unix 风格绝对路径。
1 class Solution { 2 public String simplifyPath(String path) { 3 4 if(path.length()==0||path.length()==1){ 5 return "/"; 6 } 7 //给尾部添/,只样最后的一个路径也可以在循环中处理,同时在最后也要处理掉/ 8 path=path+"/"; 9 10 //路径列表 11 ArrayList<String> arrayList=new ArrayList<>(); 12 StringBuilder sb=new StringBuilder(path); 13 14 int i=0; 15 int t=0; 16 //每次找到/path,分析这个/path是什么 17 while((i=sb.indexOf("/",t+1)) >0){ 18 19 String s=sb.substring(t,i); 20 21 //切到上级目录,就是把当前目录从路径列表删除,arrayList为空,不需要删除 22 if(s.equals("/..")){ 23 if(arrayList.size()!=0){ 24 arrayList.remove(arrayList.size()-1); 25 } 26 t=i; 27 continue; 28 } 29 //为/.是当前目录,直接跳过不用处理 30 if(s.equals("/.")||s.equals("/")){ 31 t=i; 32 continue; 33 } 34 //正常路径,添加到路径列表 35 arrayList.add(s); 36 t=i; 37 } 38 //最后一个/也要放进去 39 arrayList.add(sb.substring(t)); 40 41 String res= String.join("",arrayList); 42 43 44 if(res.length()==0||res.length()==1){ 45 return "/"; 46 } 47 48 if(res.charAt(res.length()-1)==‘/‘){ 49 return res.substring(0,res.length()-1); 50 } 51 return res; 52 } 53 }
原文:https://www.cnblogs.com/SEU-ZCY/p/14710745.html