简化路径【栈模拟解法】

题文:

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…)
表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs
相对路径

请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 /
结尾。此外,规范路径必须是表示绝对路径的最短字符串。

示例:

示例1:

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

示例2:

输入:"/…/"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。

示例3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例4:

输入:"/a/./b/…/…/c/"
输出:"/c"

示例5:

输入:"/a/…/…/b/…/c//.//"
输出:"/c"

示例6:

输入:"/a//bc/d//././/…"
输出:"/a/b/c"

思路分析

通过对Unix风格的文件系统分析,可以得出本题考查的要素关键:
/.为当前路径;
/..为当前路径的上一级;
/xx/之前的路径下打开xx;
这让人不禁联想到栈的应用,使用栈来存储当前打开的路径的每一段,当遍历字符串遍历到/.时保持路径不变,当遍历到/..时弹出栈顶路径(前提栈不空),其他的则入栈。剩下的注意点便只有多重/的出现和结尾的/
至于实现细节,看代码可能比较方便。
本算法时间复杂度为 O ( n ) O(n) O(n).

代码展示

在本代码中,我使用了deque(双向队列),实际上主要用到的功能还是栈的功能,在双向队列中表现为只操作队尾,之所以用到队头的原因是为了方便输出,实际上只使用stack(栈)也是很方便输出的。

string simplifyPath(string path) {
        if(path.empty()) return "";
        deque<string> temp;
        string str,ans; 
        if(path[path.size()-1]!='/') path+="/";
        for(int i=0;i<path.size();++i){
            if(!str.empty()&&str[str.size()-1]=='/'&&path[i]=='/') continue;
            str+=path[i];
            if(path[i+1]=='/'&&path[i]!='/'){
                if(str=="/.."){
                    if(!temp.empty()){
                        temp.pop_back();
                    }
                }
                else if(str!="/.") {
                    temp.push_back(str);
                }
                str.clear();
            }
        }
        if(temp.empty()) return "/";
        while(!temp.empty()){
            ans+=temp.front();
            temp.pop_front();
        }
        while(ans[ans.size()-1]=='/') ans.erase(ans.end());
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值