单词消消乐题解

按照题意模拟即可,通过观察我们会发现第一个单词永远是从后往前抵消,而第二个单词永远是从前往后抵消,所以我们用栈保存第一个单词,用队列保存第二个单词,抵消模拟即可。时间复杂度,空间复杂度

class Solution {
public:
    /**
     * 
     * @param Words string字符串vector 
     * @return string字符串
     */
    string WordsMerge(vector<string>& Words) {
        // write code here
        int n=Words.size();
        stack<char>stk;
        queue<char>q;
        for(int i=0;i<Words[0].length();i++) stk.push(Words[0][i]);
        for(int i=1;i<n;i++) {
            while(!q.empty()) q.pop();
            for(int j=0;j<Words[i].length();j++) q.push(Words[i][j]);
            while(!q.empty()&&!stk.empty()&&q.front()==stk.top()) {
                q.pop();
                stk.pop();
            }
            while(!q.empty()) {
                stk.push(q.front());
                q.pop();
            }
        }
        string ans="";
        while(!stk.empty()) {
            ans+=stk.top();
            stk.pop();
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

由于只要在尾部插入和删除较多的情况,并且vector和string等的线性容器本身就是栈,将答案字符串ret当做栈,设置一个指针ptr指向正在访问的字符串的str头部
如果ret.back()==ret[ptr],ret进行pop_back操作,ptr后移;否则退出比较,返回
ret+str.substr(i)即可。

class Solution {
public:
    /**
     *
     * @param Words string字符串vector
     * @return string字符串
     */
    string WordsMerge(vector<string>& Words) {
        // write code here
        string ret;
        for (int i = 0, j = 0; i < Words.size(); i++)
        {
            for (j = 0; ret.size() && Words[i].size() && Words[i][j] == ret.back(); j++,ret.pop_back());
            ret += Words[i].substr(j);
        }
        return ret;
    }
};
全部评论

相关推荐

头像
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务