LeetCode71——Simplify Path
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;
}
};
还没有评论,来说两句吧...