// 该题逻辑: 第一步:扫描字串: 跳过每次遍历开头碰到的所有斜杠,收集字母的字符串,碰到 '.' 的话不理睬,碰到 ‘..’ 的话,能弹栈就弹栈,这样,就把待显示的数据收集好了。
// 第二步: 弹栈并 组合
#include<algorithm>
#include<stack>
#include<iostream>
#include<string>
using namespace std;
// my fault: 示例给的有问题,没解释清楚哪些情况下字符是排除的
// 该题逻辑: 第一步:扫描字串: 跳过每次遍历开头碰到的所有斜杠,收集字母的字符串,碰到 '.' 的话不理睬,碰到 ‘..’ 的话,能弹栈就弹栈,这样,就把待显示的数据收集好了。
// 第二步: 弹栈并 组合
class Solution {
public:
string simplifyPath(string path) {
int size = path.size();
if(size == 0){
return "/";
}
stack<string> ss;
int i =0;
while(i<size){
// 跳过斜杠
while(i<size && path[i] == '/'){
++i;
}
// 收集字符
string s = "";
// 假设不会有 aaaa.. 的情况
while(i<size && path[i] != '/'){
s += path[i++];
}
if(".." == s && !ss.empty()){
ss.pop();
}else if(s != "" && "."!= s && ".."!= s){
ss.push(s);
}
}
// 数据都在栈里了,现在要拿出来使用了
if(ss.empty()){
return "/";
}
string result="";
while(!ss.empty()){
result = "/" + ss.top() + result;
ss.pop();
}
return result;
}
};
int main(){
Solution s;
cout << s.simplifyPath("/../..///MF/.././.././HrRfw/YwpaM/yHqLG/./bIJnF///./YWJ/Nbv/Y/./..///./../RzxEb/ZVIeu/JZEKR");
return 0;
}