力扣第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; } };
原创内容 转载请注明出处