力扣 题目71- 简化路径
题解
这里我使用栈来做
分为两部分
1.分割
我们需要将path的路径进行分割 /home//foo/ -> home foo
注意:1.以/分割 多/视为一个/
2.最后/特殊处理 因为由于/可能不在最后 所以最后的字段分割需要特殊处理
1 stack<string> stk; 2 string remain; 3 for (int i = 0; i < path.size(); i++) { 4 //判断是否为/ 5 if (path[i] == '/') { 6 if (remain.length()>0) { 7 stk.push(remain); 8 remain = ""; 9 } 10 continue; 11 } 12 remain += path[i]; 13 //判断最后一个是不是/ 如果不是则添加remain(由于上面是按照/划分 所以这里要判断) 14 if ((i == path.size() - 1) && path[i] != '/') { 15 stk.push(remain); 16 } 17 }
2.输出并判断
输出栈顶至空
对输出的字段 分成4种情况
1. 如果是..则ellipsis+1(ellipsis是为了抵消下一次正常字段)
2. 如果. 什么也不做
3.如果ellipsis>0 则省略当前栈顶 而且 ellipsis-1
4.其他情况 simpath.insert(0, "/" + stk.top()); 在最后结果前面插入
1 int ellipsis = 0; 2 string simpath = ""; 3 while (!stk.empty()) { 4 //如果为.. 5 if (stk.top() == "..") 6 { 7 ellipsis += 1; 8 } 9 //如果为. 10 else if (stk.top() == ".") 11 { 12 } 13 //如果ellipsis>0 要省略当前目录 14 else if (ellipsis > 0) { 15 ellipsis -= 1; 16 } 17 //其他情况则在开头正常添加 18 else 19 { 20 simpath.insert(0, "/" + stk.top()); 21 } 22 stk.pop(); 23 }
最后如果结果为根目录 simpath无法被添加任何东西即为空 但要返回/(特殊判断)
1 //如果最后simpath == "" 说明当到根目录 直接返回/ 2 if (simpath == "") { 3 return "/"; 4 } 5 return simpath;
代码
1 #include<iostream> 2 #include<string> 3 #include<stack> 4 using namespace std; 5 class Solution { 6 public: 7 string simplifyPath(string path) { 8 //1.切割/到栈 9 stack<string> stk; 10 string remain; 11 for (int i = 0; i < path.size(); i++) { 12 //判断是否为/ 13 if (path[i] == '/') { 14 if (remain.length()>0) { 15 stk.push(remain); 16 remain = ""; 17 } 18 continue; 19 } 20 remain += path[i]; 21 //判断最后一个是不是/ 如果不是则添加remain(由于上面是按照/划分 所以这里要判断) 22 if ((i == path.size() - 1) && path[i] != '/') { 23 stk.push(remain); 24 } 25 } 26 //2.输出/到记录省略 27 int ellipsis = 0; 28 string simpath = ""; 29 while (!stk.empty()) { 30 //如果为.. 31 if (stk.top() == "..") 32 { 33 ellipsis += 1; 34 } 35 //如果为. 36 else if (stk.top() == ".") 37 { 38 } 39 //如果ellipsis>0 要省略当前目录 40 else if (ellipsis > 0) { 41 ellipsis -= 1; 42 } 43 //其他情况则在开头正常添加 44 else 45 { 46 simpath.insert(0, "/" + stk.top()); 47 } 48 stk.pop(); 49 } 50 //如果最后simpath == "" 说明当到根目录 直接返回/ 51 if (simpath == "") { 52 return "/"; 53 } 54 return simpath; 55 } 56 }; 57 58 int main() { 59 Solution sol; 60 string path = "/home//b/./././d"; 61 string simpath=sol.simplifyPath(path); 62 cout << simpath << endl; 63 64 }