C语言–点击消除
描述
描述
牛牛拿到了一个字符串。
他每次“点击”,可以把字符串中相两个相同字母消除,例如,字符
串”abbc"点击后可以生成"ac".
但相同而不相邻、不相同的相邻字母都是不可以被消除的。
牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?
输入描述
一个字符串,仅由小写字母组成。(字符串长度不大于300000)
输出描述
一个字符串,为“点击消除”后的最终形态。若最终的字符串为空串,则输出0.
案例
输入:abbac
输出:c
输入:abba
输出:0
思路
用栈思想(这里的栈用数组表示),先拿第一个字符放入栈中,以后拿字符进栈时与前一个数比较一下,如果不相等就不管,若相等就把数组下标减小1,后面的字符把它覆盖即可。
代码
#include <stdio.h>
int main()
{
char ch[100];//假设这是栈
int i = 0;
ch[0] = getchar();
for (i = 1; (ch[i] = getchar()) != '\n'; )
{
if (i > 0 && ch[i] == ch[i - 1])
{
i = i - 2;//下标先向前移动2,后面i++,相等于就移动了一位。那为什么不直接写成i=i-1并把后面的i++去掉呢,
//因为当这个字符与前面的字符不相同时,就进不了循环,但是拿字符这个动作不能停下,所以必须i++.
}
i++;
}
ch[i] = '\0';//%s 遇到 \0 才停下
//输出
if (i == 0)
{
printf("0");
}
else
printf("%s", ch);
return 0;
}
运行结果
创作过程不易,如果对您有帮助,可以点个免费的小心心吗