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

查看11道真题和解析