单词消消乐题解

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

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;
    }
};
全部评论

相关推荐

07-11 18:47
已编辑
门头沟学院 后端
在看数据的孤勇者很想...:如果你是在校硕士,六段大厂实习一眼假,假设一段实习两个月,硕一暑假,硕一寒假,大四暑假,大四寒假,大三寒假,大三暑假,哥们,你怎么卷吗,寒假基本两个月在企业实习不现实,所以你可能是日常实习,但是你不可能每段日常实习都是两个月吧,他们日常实习都是三个月起步这样,所以你往前推一下,一段日常实习,就三个月,敢情你大学生课都不上,全在实习吗?你自己问问自己,六段大厂实习,一点没学到,自己说出来会不会笑呀,不管学历,但凡有一段大厂实习都很牛逼了
投递米哈游等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务