消消乐游戏_字符串消除_100分_A/B卷复用_数据结构/栈

消消乐游戏_字符串消除

题目描述:

游戏规则:输入一个只包含英文字母的字符串,字符串中的两个字母如果相邻且相同,就可以消除。
在字符串上反复执行消除的动作,直到无法继续消除为止,此时游戏结束。
输出最终得到的字符串长度。

输入输出描述:

输入描述:

  输入原始字符串 str ,只能包含大小写英文字母,字母的大小写敏感, str 长度不超过100。

输出描述:

  输出游戏结束后,最终得到的字符串长度。

示例1:

输入:
	gg
输出:
	0
说明:
	gg 可以直接消除,得到空串,长度为0。

示例2:

输入:
	mMbccbc
输出:
	3
说明:
	在 mMbccbc 中,可以先消除 cc ;
	此时字符串变成 mMbbc ,可以再消除 bb ;
	此时字符串变成 mMc ,此时没有相邻且相同的字符,无法继续消除。
	最终得到的字符串为 mMc ,长度为3

备注:
  输入中包含 非大小写英文字母时,均为异常输入,直接返回 0。

解题思路:

题目描述相同字母相邻可消除,消除后相邻且相同的字母,又可以消除。
适合使用栈来求解:
如果当前字符和栈顶字符相同,则弹出栈顶字母,表示两个相同字母被消除。
如果当前字符和栈顶字符不相同,则直接将当前字符入栈,表示当前字符暂时没有被消除。
遍历完字符数组,栈中剩下的字符都是没有被消除的字符。

代码:

public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	String line = scanner.nextLine();
	char[] chars = line.toCharArray();
	Deque<Character> stack = new ArrayDeque<>();

	int n = chars.length;
	for (int i = 0; i < n; i++) {
		// 检查是否出现非大小写的英文字母
		if (!(chars[i] >= 'A' && chars[i] <= 'Z') && !(chars[i] >= 'a' && chars[i] <= 'z')) {
			System.out.println(0);
			return;
		}

		// 栈顶字母与当前字母相同
		if (!stack.isEmpty() && stack.peekLast() == chars[i]) {
			stack.pollLast();
		} else {
			// 入栈
			stack.offerLast(chars[i]);
		}
	}

	System.out.println(stack.size());
}

数据结构栈相关题目:

最大括号深度_100分_B卷_单调栈
找朋友_200分_B卷_单调栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值