目录
题目描述
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述:
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述:
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0。
示例1
输入:
abbc输出:
ac复制
示例2
输入:
abba输出:
0复制
示例3
输入:
bbbbb输出:
b
题目分析
利用栈结构实现
比如:abba 这个字符串
a 先入栈,入栈后看是否和 b 相同,不同的话 b 也入栈,然后第三个 b 判断和栈顶元素是否相同,因为此时栈顶元素是第二个 b,是相同的,所以把栈顶元素的 b 和第三个 b 消除掉,最后把 两个 a 也消除掉
但是可以使用 sting 来模拟栈结构,因为 sting 是有尾插尾删的功能的,刚好模拟栈的出栈入栈
代码实现
#include<iostream>
#include<string>
using namespace std;
int main()
{
// 输入
string s;
cin >> s;
// 输出
string st;
// 遍历要消除的字符串
for (auto ch : s)
{
if (st.size() != 0 && st.back() == ch)
{
st.pop_back();
}
else
{
st.push_back(ch);
}
}
if (st.size() == 0)
cout << 0 << endl;
else
cout << st << endl;
return 0;
}
当 st 字符串中不为空时,并且 st 中的最后一个字符和 ch 相同时,你们就是相邻的两个字符。直接尾删
否则就尾插当前 ch 字符