每日一题(LeetCode)----栈和队列-- 简化路径

每日一题(LeetCode)----栈和队列-- 简化路径

1.题目(71. 简化路径

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

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

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

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

    返回简化后得到的 规范路径

    示例 1:

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

    示例 2:

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

    示例 3:

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

    示例 4:

    输入:path = "/a/./b/../../c/"
    输出:"/c"
    

    提示:

    • 1 <= path.length <= 3000
    • path 由英文字母,数字,'.''/''_' 组成。
    • path 是一个有效的 Unix 风格绝对路径。

2.解题思路

思路一:使用栈

1.创建一个栈
2.如果当前栈中有元素
1> 如果当前栈中没有元素,那么将当前遍历到的字符入栈
2>如果当前栈中有元素
1 如果当前遍历到的字符为’/',那么与栈顶元素进行比较

如果栈顶字符也是’/',那么当前遍历到的字符不入栈,继续遍历下一个字符

如果栈顶字符不是’/',那么将当前遍历到的字符入栈,继续遍历下一个字符

2 如果当前遍历到的字符不是’/‘也不是’.',那么将将当前遍历到的字符入栈,继续遍历下一个字符
3 如果当前遍历到的字符是’.‘,我们用一个循环来获取’.‘出现的次数,并在每一次循环中先将’.‘入栈,如果’.‘的下一个不是’/‘(注意这个条件是在字符串有效的范围内生效的)那么继续遍历下一个字符,如果是’/‘就看’.'出现的次数

如果’.‘出现的次数小于等于两次,我们看第一次出现’.‘时,前一个字符是不是’/',

如果不是,那么继续遍历下一个字符

如果是,就看’.'时出现一次还是两次 如果是一次,我们就将栈中元素进行弹出一次

​ 如果是两次,我们就将栈顶弹出三次,然后用一个循环弹出栈顶元素,直到栈顶元素为’/'结束,继续遍历下一个字符(注意如果栈中只有一个元素了,那么不进行弹出操作)

3>创建一个栈,将当前栈中元素放入到新创建的这个栈中
4>创建一个字符串,将新创建的栈的元素一次放到字符串中(注意:当栈中元素不为1时,那我们要对最后一个元素进行一下处理,如果这个元素为’/',我们就不进行放入了)

3.写出代码

思路一的代码

class Solution {
public:
    string simplifyPath(string path) {
    int length = path.size();
    stack<char> sta;
    for (int i = 0; i < length;) {
        if (sta.empty()) {
            sta.push(path[i]);
        }
        else {
            if (path[i] == '/' && sta.top() == '/') {
                i++;
                continue;
            }
            else if (path[i] == '/' && sta.top() != '/') {
                sta.push(path[i]);
                i++;
                continue;
            }
            else if (path[i] != '.' && path[i] != '/') {
                sta.push(path[i]);
                i++;
            }  
            else{
                int t = 0;
                while (path[i] == '.' && i < length) {
                    sta.push(path[i]);
                    i++;
                    t++;
                }

                if (path[i] != '/'&&i<length) {
                    continue;
                }
                if (t <= 2) {
                    int temp = t;
                    if (temp == 2) {
                        if (path[i - 3] != '/') {
                            continue;
                        }
                        temp++;
                        while (temp != 0 && sta.size() > 1) {
                            sta.pop();
                            temp--;
                        }
                        while (sta.top() != '/' && sta.size() > 1) {
                            sta.pop();
                        }
                    }
                    if (temp == 1) {
                        if (path[i - 2] != '/') {
                            continue;
                        }
                        while (temp != 0) {
                            sta.pop();
                            temp--;
                        }
                    }
                }
            }

        }
    }
    string res = "";
    stack<char> sta2;
    if (sta.size() == 1) {
        res+= sta.top();
        return res;
    }
    while (!sta.empty()) {
        sta2.push(sta.top());
        sta.pop();
    }
    while (!sta2.empty()) {
        if (sta2.size() == 1 &&sta2.top() == '/') {
            break;
        }
        res += sta2.top();
        sta2.pop();
    }
    return res;

    }
};
  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序小白的code之路(记录分享)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值