LeetCode 71. Simplify Path(简化路径)

17 篇文章 0 订阅
10 篇文章 0 订阅

原题网址:https://leetcode.com/problems/simplify-path/

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

click to show corner cases.

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 Solution {
    /*
"./"
"/"
"/sa///./aa"
"/saaa"
"/."
"a/b/c/d///"
"/a/./b/../../c/"
"/home/../../.."
*/
    public String simplifyPath(String path) {
        char[] pa = path.toCharArray();
        int pos = 0;
        for(int i=0; i<pa.length; i++) {
            if (pa[i] == '/') {
                if (pos>0 && pa[pos-1] != '/') pa[pos++] = pa[i];
            } else if (pa[i] == '.') {
                if ((((pos==0) || (pos>0 && pa[pos-1] == '/')) && i+2<pa.length && pa[i+1]=='.' && pa[i+2]=='/')
                || (((pos==0) || (pos>0 && pa[pos-1] == '/')) && i+2==pa.length && pa[i+1]=='.')) {
                    //upper level
                    pos--;
                    while (pos>0 && pa[pos-1] != '/') pos --;
                    if (pos<0) pos = 0;
                    i ++;
                } else if (((pos==0) || (pos>0 && pa[pos-1] == '/')) && (i+1==pa.length || (i+1<pa.length && pa[i+1] == '/'))) {
                    // same level
                } else {
                    // normal dir
                    pa[pos++] = pa[i];
                }
            } else {
                pa[pos++] = pa[i];
            }
        }
        if (pos>0 && pa[pos-1] == '/') pos --;
        char[] simplified = new char[pos+1];
        simplified[0] = '/';
        for(int i=0; i<pos; i++) simplified[i+1] = pa[i];
        return new String(simplified);
    }
}

词法和语法分开可以简化:

public class Solution {
    public String simplifyPath(String path) {
        String[] paths = path.split("/");
        int len = 0;
        for(int i=0; i<paths.length; i++) {
            if ("..".equals(paths[i])) {
                len = Math.max(--len, 0);
            } else if (!"".equals(paths[i]) && !".".equals(paths[i])) {
                paths[len++] = paths[i];
            }
        }
        StringBuilder sb = new StringBuilder("/");
        for(int i=0; i<len; i++) {
            sb.append(paths[i]);
            if (i<len-1) sb.append("/");
        }
        return sb.toString();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值