[leetcode] 71. Simplify Path

Description

Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the canonical path.

In a UNIX-style file system, a period . refers to the current directory. Furthermore, a double period … moves the directory up a level. For more information, see: Absolute path vs relative path in Linux/Unix

Note that the returned canonical path must always begin with a slash /, and there must be only a single slash / between two directory names. The last directory name (if it exists) must not end with a trailing /. Also, the canonical path must be the shortest string representing the absolute path.

Example 1:

Input:

"/home/"

Output:

"/home"

Explanation:

Note that there is no trailing slash after the last directory name.

Example 2:

Input:

"/../"

Output:

"/"

Explanation:

Going one level up from the root directory is a no-op, as the root level is the highest level you can go.

Example 3:

Input:

"/home//foo/"

Output:

"/home/foo"

Explanation:

In the canonical path, multiple consecutive slashes are replaced by a single one.

Example 4:

Input:

"/a/./b/../../c/"

Output:

"/c"

Example 5:

Input:

"/a/../../b/../c//.//"

Output:

"/c"

Example 6:

Input:

"/a//bc/d//././/.."

Output:

"/a/b/c"

分析

题目的意思是:给你一个路径,返回其路径的最简短的形式。

  • 这个就根据题目的规则解析一下就行了。中间是".“的情况直接去掉,是”…“时删掉它上面挨着的一个路径,而下面的边界条件给的一些情况中可以得知,如果是空的话返回”/“,如果有多个”/“只保留一个。那么可以把路径看做是由一个或多个”/"分割开的众多子字符串,把它们分别提取出来一一处理即可

C++实现

class Solution {
public:
    string simplifyPath(string path) {
        vector<string> v;
        int i=0;
        int n=path.length();
        while(i<n){
            while(i<n&&path[i]=='/'){
                i++;
            }
            if(i==n) break;
            int left=i;
            while(i<n&&path[i]!='/'){
                i++;
            }
            int right=i-1;
            string s=path.substr(left,right-left+1);
            if(s==".."){
                if(!v.empty()){
                    v.pop_back();
                }
            }else if(s!="."){
                v.push_back(s);
            }
        }
        string res="";
        for(auto s:v){
            res=res+"/"+s;
        }
        return v.empty() ? "/":res;
    }
};

Python实现

这里python有一个split函数,可以对字符串进行切分,所以实现起来就很简洁。

class Solution:
    def simplifyPath(self, path: str) -> str:
        names = path.split('/')
        st = []
        for name in names:
            if name == '..':
                if st:
                    st.pop()
            elif name and name != '.':
                st.append(name)

        return '/'+'/'.join(st)

参考文献

[编程题]simplify-path
[LeetCode] Simplify Path 简化路径

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值