当前位置: 首页 > news >正文

华为OD 消消乐游戏

1. 题意

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

输入
输入原始字符串 str,需满足:
只能包含大小写英文字母(大小写敏感);
长度不超过 100。
输出
输出游戏结束后,最终剩余字符串的长度。
备注
若输入中包含非大小写英文字母(如数字、符号等),视为异常输入,直接返回 0。

样例一
input:
gg
output:
0
样例二
input:
adbbdc
output:
2

2. 题解

这个题目应该是比较典型的栈的应用,但是我写的时候没有想到,只想到了双指针的写法,还有bug,没有处理从头开始消去的情况。

2.1 为什么只需要从左往右考虑?

因为消去操作满足交换和结律,因此顺序并不重要,最后得到的字符串一定是一样的。

"aaaa"↔"(aa)aa"↔"aa(aa)"↔"a(aa)a"↔"aa"⇒"""aaaa"\leftrightarrow"(aa)aa" \leftrightarrow"aa(aa)"\leftrightarrow"a(aa)a" \leftrightarrow"aa" \Rightarrow"" "aaaa""(aa)aa""aa(aa)""a(aa)a""aa"""

2.2 栈的解法

从左往右逐个处理字符串中的元素,如果当前元素和栈顶元素一样,说明需要执行消去操作,否则就将当前元素入栈。重复操作直到字符串处理完毕,栈中剩余的字符串就是消去后的字符串。

void solve2()
{stack<char> st;for (auto c: s) {if (!st.empty() && st.top() == c ) {st.pop();}else {st.push(c);}}ans = st.size();
}
2.3 双指针解法

我们可以通过双指针分别往左右扩展来得到需要消去的区间。

初始化时,r=l+1r=l+1r=l+1,最终我们消去的区间的为[l+1,r−1][l+1,r-1][l+1,r1],因此需要减去的长度为r−l−1r-l-1rl1

但有一种情况,我们无法处理,那就是之前提到的从后面可以扩展到前面已经消除的区间,比如样例"aabbcc""aabbcc""aabbcc"

所以我们需要去重,为此我们在每次获得了消除完区间后,用一个变量pre_right保存消除区间的右边界。

下一次消除的区间左边界最多扩展到pre_right,就停止扩展以避免重复。


void solve1()
{int l = 0;int r = l + 1;int n = s.size();ans = n;int pre_right = -1;while ( r < n) {r = l + 1;while ( l > pre_right && r < n && (s[l] == s[r])) {l--;r++;}//cout << l << " " << r << endl; ans -= ( r - l - 1);if ( r - l > 1) {pre_right = r - 1;}l = r;}}

3. 参考

KJ.JK

http://www.dtcms.com/a/279037.html

相关文章:

  • 机器学习/深度学习训练day1
  • 第十五节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - vue前端 生产部署
  • Java 中的类加载机制:从 Class 文件到内存中的类
  • 11、鸿蒙Harmony Next开发:列表布局 (List)
  • Mysql用户管理及在windows下安装Mysql5.7(压缩包方式)远程连接云服务器(linux)上的Mysql数据库
  • spring bean初始化异步执行
  • Java字符串、时间、数字知识点
  • dify 原生mcp应用案例
  • 美丽田园发布盈喜公告,预计净利增长超35%该咋看?
  • 【Linux-云原生-笔记】Rsyslog日志相关
  • AI进化论13:生成式AI的浪潮——AI不光能“说”,还能“画”和“拍”
  • 编译器 VS 解释器
  • YOLOv11开发流程
  • Linux 基础操作:vim 编辑器、网络配置与远程登录全解析
  • 学习笔记(36):用概率密度方式来了解:正态分布拟合曲线
  • sqlserver迁移日志文件和数据文件
  • java学习 day4 分布式锁
  • 《Librosa :一个专为音频信号处理和音乐分析设计的Python库》
  • 阿里云可观测 2025 年 3 月产品动态
  • APK安装器(安卓端)一键解除VX限制!轻松安装各种手机应用
  • VScode设计平台demo&前端开发中的常见问题
  • 中级统计师-经济学基础知识-第五章 国民收入决定的总收入-总支出模型
  • RK3568/3588 Android 12 源码默认使用蓝牙mic录音
  • 【安卓笔记】进程和线程的基础知识
  • Educational Codeforces Round 170 (Rated for Div. 2)
  • 第十六章 STL(仿函数、 常用算法)
  • 如何在 Ubuntu 上安装 Microsoft Edge 浏览器?
  • Solid Edge多项目并行,浮动许可如何高效调度?
  • cpp减小可执行文件、动态库大小
  • 4.2TCP/IP