这一题还是蛮有趣的。先上链接。
力扣71简化路径https://leetcode-cn.com/problems/simplify-path/
根据提示:
·1 <= path.length <= 3000
·path 由英文字母,数字,'.','/' 或 '_' 组成。
·path 是一个有效的 Unix 风格绝对路径。
基本上不用考虑特别极端的情况,因此可以专心解答。
思路比较直接,"/"是做为分隔符分割path字符串,对每一个子串进行判断,做出对应操作即可。代码如下:
package cn.daycode.leetcode;
public class SimplifyPath {
public static void main(String[] args) {
String s = "/..//.././a/sd/d/..///....//.//../home/";
System.out.println(new Solution().simplifyPath(s));
}
static class Solution {
public String simplifyPath(String path) {
// 因为主要在用拼接,所以这里用StringBuffer,初始为"/"
StringBuffer sb = new StringBuffer("/");
// 将path以"/"做为分隔符分割为若干子串的数组,这样很好的解决了多个连续"/"的情况
String[] ss = path.split("/");
// 遍历上面获取到的子串数组
for (int i = 0; i < ss.length; i++) {
// 对数组中每个元素判断并操作
switch (ss[i]){
//以下两种情况都不需要做任何操作
case "":
case ".":
break;
//".."要返回上一级目录
case "..":
// 判断长度大于1,因为长度为1时为根目录,不需要返回上一级(也无法返回)
if(sb.length()>1){
// 根据拼接逻辑,需要返回上一级目录的情况下,需要找出倒数第二个"/"
int tempLength = sb.length()-1; // sb长度-1,为了去掉每次都拼接在最后的"/"
// 将倒数第二个"/"到sb.leng()-1位置替换为""(空字符串),模拟返回上一级目录
sb.replace(sb.substring(0,tempLength).lastIndexOf("/"),tempLength,"");
}
break;
default:
// 一般情况为正常目录,拼接在sb后面,并拼接一个"/"
sb.append(ss[i]).append("/");
}
}
// 最后判断以下长度,如果大于1,返回sb长度-1的子串(因为最后一个字符是"/",不希望其输出)
// 如果长度不大于1则长度为1,意味着是根目录,直接返回"/"即可
return sb.toString().substring(0,sb.length()>1?sb.length()-1:1);
}
}
}