leetcode-简化路径


给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名(如果存在)不能 以 '/' 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
返回简化后得到的 规范路径 。

 

示例 1:

输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/simplify-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

两种输入

  • /
  • 其它
    分情况处理 如果是 / 直接忽略即可
    否则继续向下查找直到遇到下一个 / ,中间的字符认为是路径
    对于路径 如果只有一个 . 忽略 如果只有两个 . 回退目录 其余情况添加一级目录。
    可以用一个 list 表示目录,回退时 list size - 1即可,添加时 list 中 add
class Solution {
   public String simplifyPath(String path) {
       if (null == path || path.length() <= 0) {
           return path;
       }
       List<String> result = new ArrayList<>();
       int i = 1;
       int j; StringBuilder sb;
       while (i < path.length()) {
           char input = path.charAt(i);
           switch (input) {
               case '.':
                   j = i;
                   sb = new StringBuilder();
                   while (isPath(path, j)) {
                       sb.append(path.charAt(j));
                       j++;
                   }
                   String r = sb.toString();
                   if (r.length() > 2) {
                       result.add(r);
                   } else if (r.length() == 2) {
                       if (r.charAt(1) == '.') {
                           safeBack(result);
                       } else {
                           result.add(r);
                       }
                   }
                   i = j;
                   break;
               case '/':
                   break;
               default:
                   j = i;
                   sb = new StringBuilder();
                   while (isPath(path, j)) {
                       sb.append(path.charAt(j));
                       j++;
                   }
                   result.add(sb.toString());
                   i = j;
                   break;
           }
           i++;
       }
       if (result.size() < 1) {
           return "/";
       }
       sb = new StringBuilder();
       for (i = 0; i < result.size(); i++) {
           sb.append("/").append(result.get(i));
       }
       return sb.toString();
   }

   private boolean isPath(String path, int i) {
       return i < path.length() && path.charAt(i) != '/';
   }

   private boolean isDot(String path, int i) {
       return i < path.length() && path.charAt(i) == '.';
   }

   private void safeBack(List<String> result) {
       Object obj = result.size() == 0 ? null : result.remove(result.size() - 1);
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值