Leetcode 71 Simply Path

题意:给定一个字符串我要得到简化后的路径。 '...'代表上个路径,'.'代表当前路径

Input: path = "/home/user/Documents/.../Pictures"

Output: "/home/user/Pictures"

https://leetcode.com/problems/simplify-path/description/

解析:首先这道题肯定是从头到尾遍历来做,难点在于我应该用什么判断语句。

如果结尾能够+一个'/'判断会少很多。用一个cur变量来保存当前可以进入栈的元素,用一个栈来存放当前所有的路径,最后重组即可。

cpp 复制代码
class Solution {
public:
    string simplifyPath(string path) {
        vector<string> st;
        string cur;
        string ret;
        if(path.back() != '/') {
            path += '/';
        }
        for(int i = 0; i < path.size(); i++) {
            if(path[i] != '/') {
               cur += path[i];
               continue;
            } else {
                if (cur == "..") {
                    if(st.size()) {
                    st.pop_back();
                    }
                } else if (cur != "." && cur.size()) {
                    st.push_back(cur);
                }
                cur.clear();
            }

        }
            if(!st.size()) return "/";
            for(auto&p : st) {
                ret += '/';
                ret += p;
            }
            return ret;
    }
};

Leetcode 71(错误答案)

这种情形没有考虑到/...hidden/的情形

cpp 复制代码
class Solution {
public:
    string simplifyPath(string path) {
        vector<string> st;
        string ret;
        for(int i = 0; i < path.size(); i++) {
            if(isalpha(path[i])) {
                int j = i;
                while(isalpha(path[j])) j++;
                string p = path.substr(i, j-i);
                st.push_back(p);
                i = j - 1;
            }
            if(path[i] == '.')  {
                int j = i;
                while((path[j] == '.')) j++;
                // one dot
                if(j-i == 1)
                    continue;
                if(j-i == 2) {
                    if(st.size()) {
                        st.pop_back();
                    }
                }
                if(j-i > 2) {
                    string p = path.substr(i, j-i);
                    st.push_back(p);
                }
                i = j - 1;
            }
            if(path[i] == '/') continue;
        }
            if (!st.size()) {
                return "/";
            }
            for(auto&p : st) {
                ret += '/';
                ret += p;
            }
            return ret;
    }
};
相关推荐
smj2302_796826525 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
_深海凉_9 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录10 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
superior tigre13 小时前
78 子集
算法·leetcode·深度优先·回溯
superior tigre15 小时前
739 每日温度
算法·leetcode·职场和发展
6Hzlia15 小时前
【Hot 100 刷题计划】 LeetCode 15. 三数之和 | C++ 排序+双指针
c++·算法·leetcode
北顾笙98017 小时前
day37-数据结构力扣
数据结构·算法·leetcode
6Hzlia19 小时前
【Hot 100 刷题计划】 LeetCode 189. 轮转数组 | C++ 三次反转经典魔法 (O(1) 空间)
c++·算法·leetcode
m0_6294947320 小时前
LeetCode 热题 100-----13.最大子数组和
数据结构·算法·leetcode
田梓燊20 小时前
力扣:94.二叉树的中序遍历
数据结构·算法·leetcode