LeetCode SimplifyPath

题意

中文描述 给定一个文件的绝对路径(Unix-style),进行简化.

题解

算法及复杂度 (6 ms) 本题主要的处理对象分为: “.”, “…”, “/”, 普通文件或目录名.其中".“的作用是保持当前的目录,”…“的作用是退回上一级目录,”/“的作用的分隔符, 普通文件或目录名不需要进行特殊处理. 很容易的思路(模拟),根据”/“对所有字符串进行分割,得到不同的三类字符串: “.”, “…”, 普通文件或目录名.分割过程是比较容易实现的,就是简单的读取字符串,然后分割. 由于”…“有回退的作用,因此可以考虑使用stack进行实现.在上一段中叙述的分割的过程中进行处理:(1)遇到普通目录名就进行压栈;(2)遇到”.“就跳过不处理;(3)遇到”…“就对栈进行弹出(保证栈不为空的情况下). 存在问题的几点: (1)输入字符串为空字符串,则返回空字符串,而不是根目录”/";(2)输入字符串的第一个字符一定是’/’,而不是任意的(leetcode的参考程序会报错);(3)存在"…", "…"这样的路径,在本题中被认为是普通的目录或文件名. 时间复杂度: O(n). n 表示输入字符串的长度,只需要一次遍历就可以完成,因此是 O(n) 的复杂度. 代码参见本文件夹下solution.cpp

算法正确性

正确性证明 模拟的思想,根据题目提供的方法在进行操作,提供的已知条件保证了算法的正确性. 举个例子

//输入序列
path = “/abc/…/…”
//分割第一个字符串,得到"abc",入栈st
st = [“abc”]
//分割第二个字符串,得到:…",弹栈st
st = []
//继续分割,得到"…",入栈st
st = ["…"]
//还原path,最后得到path

CPP代码

public:

    string simplifyPath(string path) {
        
        if(path.length() == 0) {  // "" returns "", not "/" 
            return "";
        }
        
        stack<string> st;
        
        // simplify
        for(int i = 0; i < path.length(); i ++) {
            if(path[i] == '/') {
                continue;
            } else {
                string tmp;
                while(i < path.length() && path[i] != '/') {
                    tmp += path[i];
                    i ++;
                }
                if(tmp == ".") {
                    continue;
                } else if(tmp == "..") {
                    if(!st.empty()) {
                        st.pop();
                    }
                } else {
                    st.push(tmp);
                }
            }
        } 
        
        // resume the string
        string ans = "/";
        while(!st.empty()) {
            ans = "/" + st.top() + ans;
            st.pop();
        } 
        if(ans.length() > 1) {
            ans[ans.length() - 1] = '\0';
        }
        return ans;
    }
};
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读