71. Simplify Path

2018-10-11  本文已影响5人  analanxingde

一个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));
        }
    };

解法思路

  1. 以/为分隔符,得到/之间的字符串:item。注意,为了处理..的情况,需要现将字符串存在stack中,进行弹栈。之后输出时,再放到vector中进行反转输出。
  2. 对于item:1). 跳过 2).. 弹栈 3)其余的字符串,push到stack中
  3. 将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;
    }
};
上一篇下一篇

猜你喜欢

热点阅读