点击消除
- 题目
- 题解(116)
- 讨论(61)
- 排行
时间限制:1秒 空间限制:256M
校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
思路:
用一个变量l表示当前最后一个元素下标,然后对字符串每一个进入元素进行判断,如果一样则l--,表示往前移,消除元素,反之则在++l位置插入元素。
或者利用字符串的pop函数,对每一个进入的元素,如果当前要输出的数组有元素且末尾元素和进入元素相同,则pop掉,否则就插入进去。
#include <iostream>
#include<vector>
using namespace std;
int main() {
string ss;
cin>>ss;
// vector<char>s1(ss.size());
// s1[0]= ss[0];
// int l = 0;//l表示当前最后一个元素的下标
// for (int i = 1; i < ss.size(); i++)
// {
// if (l == -1 || s1[l] != ss[i])
// {
// s1[++l] = ss[i];
// }
// else {
// l--;
// }
// }
// if(l==-1)
// cout<<0;
// for (int i = 0; i <= l; i++)
// cout << s1[i];
string ret;
for(int i=0;i<ss.size();i++)
{
if(ret.size()&&ret.back()==ss[i])
ret.pop_back();
else
ret+=ss[i];
}
if(ret.size()==0)
cout<<0;
else
cout<<ret;
}
// 64 位输出请用 printf("%lld")