LeetCode71——Simplify Path

来源:互联网 发布:java自我介绍一分钟 编辑:程序博客网 时间:2024/05/04 21:35

LeetCode71——Simplify Path

依然是恶心的字符串处理,倒不是有多难,是你不知道他有哪些Sample Input,你得把所有的情况考虑进去。。。

我在做的时候就没有考虑非法输入,也就是说,我默认认为给定的输入都是合法的路径名。。。

但是题目会给出/home///near/ 这种非法路径输入,或者是 /home/zhangxiao/.../ 这种,非常恶心。。。


好了,这个题目没啥好说的,维护一个栈,要化简的话,考虑当前目录(一个.)和上级目录(两个.)非法目录 (多个.)

然后斜杠‘/’的情况判断栈顶元素再考虑是否忽略。。。


这题改得一塌糊涂,好在最后通过了

代码:

class Solution {private:void remove(string & path){int i = path.size() - 1;while (i > 0 && path[i] == '/'){path.pop_back();i--;}}public:string simplifyPath(string path) {remove(path);vector<char>tmpResult;stack<char>symbol;int dotCount = 0;for (int i = 0; i < path.size(); i++){if (path[i] == '/'){if (!symbol.empty() && symbol.top() == '/')continue;symbol.push(path[i]);}else if (path[i] == '.'){if (path[i + 1] == '.'){dotCount = 0;int j = i;while (j < path.size() && path[j] == '.'){dotCount++;j++;}if (dotCount == 2){if (path[j] == '/'||j==path.size()){symbol.pop();//去掉'/'while (!symbol.empty() && symbol.top() != '/')symbol.pop();if (!symbol.empty())symbol.pop();i = i + 1;}else{symbol.push('.');}}else{i += dotCount - 1;while (dotCount--){symbol.push('.');}}}else if (isalpha(path[i + 1])){symbol.push(path[i]);continue;}}else{symbol.push(path[i]);}}if (symbol.empty())return "/";while (!symbol.empty()){tmpResult.insert(tmpResult.begin(), symbol.top());symbol.pop();}string result(tmpResult.begin(), tmpResult.end());remove(result);return result;}};


0 0
原创粉丝点击