Leetcode: 488.祖玛游戏
488. 祖玛游戏
解题思路:
在刚开始看题时虽然想到了可能要用dfs来解决,但是对于每次插入球后的消球过程没有特别好的解决思路,后续参考了其他的题解后才得到了快慢指针用于处理插入球后的消除过程的Update思路,并且也考虑到了记忆化搜索优化超时。
- 整个解题过程分为两个阶段,DFS+记忆化搜索+回溯与每次插入后的消除过程
- 每次插入后的消除过程采用了快慢指针的方式,设slow指针和fast指针的初始值为0,fast遍历插入球后的整个字符串。
- 若fast<board.size()且board[fast]==board[slow]则代表当前slow和fast所指代的球的颜色是相同的,进行continue的操作
- 若fast-slow>=3则代表当前慢指针slow到快指针fast之间为三个或三个颜色相同以上的球,因此用string.erase来进行消除操作,同时设fast=0,需要重新进行遍历
- 每次遍历结束的末尾需要将slow=fast,因为当前指代的是fast与slow中指代的不是相同颜色的球,所以slow的判断可以继续往下来搜索。
- 主函数通过DFS+记忆化搜索+回溯的方式
- 用set<pair<string,int>>的vis来存储对应的board字符串板子对应已经扔球的次数,来防止有重复的DFS过程发生
- 对于每次的DFS过程都需要遍历当前的board的每一个位置以及当前手上的所有球,并且创建好新的插入球的板子nb并且进行Update过程,所得到的nb进入下一层的DFS过程,并且因为是&hand,记住要进行回溯操作,即在该层dfs结束后把扔进去的球重新加入到hand中。
- 每次插入后的消除过程采用了快慢指针的方式,设slow指针和fast指针的初始值为0,fast遍历插入球后的整个字符串。
以下是C++代码:
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 风之歌!
评论