力扣第71题:用栈轻松解决Unix路径简化问题

题目解读:
在Unix风格的文件系统中,我们经常需要处理各种复杂的路径表示。给定一个绝对路径字符串,我们需要将其转换为最简化的规范路径。规范路径要求:路径始终以斜杠'/'开头;两个目录名之间必须只有一个斜杠'/';不能包含'.'(表示当前目录)或'..'(表示上级目录)这样的特殊符号,除非它们确实表示路径结构;路径末尾不能有斜杠(根目录除外)。例如,将"/a/./b/../../c/"简化为"/c"。
解题思路与过程:
1.用栈的结构来处理路径简化问题。从路径的第二个字符开始遍历(因为第一个字符必定是'/'),逐个字符构建临时字符串tmp。每当遇到'/'或到达字符串末尾时,就对tmp中存储的路径片段进行处理。
2.对于".."操作,需要弹出栈顶元素(如果栈不为空),相当于返回上一级目录;对于"."或空字符串则直接忽略;其他合法目录名则压入栈中。遍历完成后,如果栈为空则返回根目录"/",否则将栈中元素按顺序拼接成规范路径。
代码与注释:
class Solution {
public:
string simplifyPath(string path) {
stack<string> s; // 使用栈存储路径的有效目录名
string str=""; // 最终结果字符串
string tmp=""; // 临时存储当前处理的路径片段
// 从第二个字符开始遍历(第一个字符必定是'/')
for(int i=1;i<path.size();i++) {
// 遇到'/'或到达字符串末尾时处理当前路径片段
if(path[i]=='/' or i==path.size()-1) {
// 如果当前字符不是'/',将其加入临时字符串
if(path[i]!='/') {
tmp+=path[i];
}
// 处理".."情况:弹出栈顶目录(返回上一级)
if(tmp=="..") {
if(!s.empty()) {
s.pop();
}
}
// 处理有效目录名:压入栈中
else if(tmp!="." and tmp!="") {
s.push(tmp);
}
tmp=""; // 重置临时字符串
}
else {
tmp+=path[i]; // 构建当前路径片段
}
}
// 处理空栈情况(直接返回根目录)
if(s.empty()) return "/";
// 将栈中目录名按顺序拼接成规范路径
while(!s.empty()) {
str="/"+s.top()+str;
s.pop();
}
return str;
}
};
原创内容 转载请注明出处



