一个split string字符串的小函数
//调用:split(path,s,&paths);
void split(string& s,string& delim,std::vector<string>* ret)
{
size_t last = 0;
size_t index = s.find_first_of(delim,last);
while(index != string::npos)
{
ret->push_back(s.substr(last,index-last));
last= index+1;
index = s.find_first_of(delim,last);
}
if(index-last > 0)
{
ret->push_back(s.substr(last,index-last));
}
};
解法思路
- 以/为分隔符,得到/之间的字符串:item。注意,为了处理..的情况,需要现将字符串存在stack中,进行弹栈。之后输出时,再放到vector中进行反转输出。
- 对于item:1). 跳过 2).. 弹栈 3)其余的字符串,push到stack中
- 将stack的内容放到vector中,并对其进行反转
reverse(strs.begin(), strs.end());
,输出。(注意,当vector的长度为0时,要加入/符号)
class Solution {
public:
string simplifyPath(string path) {
stack<string> sk;
int i = 0;
while(i < path.size()) {
while(i < path.size() && path[i] == '/')
i++;
// deal with situation where there's a bunch of / at the end
if(i == path.size()) break;
string item = "";
while(i < path.size() && path[i] != '/')
{
item.push_back(path[i]);
i++;
}
if(item == ".")
continue;
else if(item == ".."){
if(!sk.empty())
sk.pop();
}
else
sk.push(item);
}
vector<string> strs;
while(!sk.empty()) {
string item = sk.top();
sk.pop();
strs.push_back(item);
}
reverse(strs.begin(), strs.end());
string ans = "";
for(string & item:strs) {
ans += "/";
ans += item;
}
if(ans.size() == 0)
ans += "/";
return ans;
}
};
网友评论