LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)
文章目录
- 1. 题目
- 2. 解题
1. 题目
给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态。
填字游戏格子中包含小写英文字母(已填入的单词),表示 空格 的 ' '
和表示 障碍 格子的 '#'
。
如果满足以下条件,那么我们可以 水平 (从左到右 或者 从右到左)
或 竖直 (从上到下 或者 从下到上)
填入一个单词:
- 该单词不占据任何
'#'
对应的格子。 - 每个字母对应的格子要么是
' ' (空格)
要么与 board 中已有字母 匹配 。 - 如果单词是 水平 放置的,那么该单词左边和右边 相邻 格子不能为 ’ ’ 或小写英文字母。
- 如果单词是 竖直 放置的,那么该单词上边和下边 相邻 格子不能为 ’ ’ 或小写英文字母。
给你一个字符串 word ,如果 word 可以被放入 board 中,请你返回 true ,否则请返回 false 。
示例 1:
输入:board = [["#", " ", "#"], [" ", " ", "#"], ["#", "c", " "]],
word = "abc"
输出:true
解释:单词 "abc" 可以如上图放置(从上往下)。
示例 2:
输入:board = [[" ", "#", "a"], [" ", "#", "c"], [" ", "#", "a"]],
word = "ac"
输出:false
解释:无法放置单词,因为放置该单词后上方或者下方相邻格会有空格。
示例 3:
输入:board = [["#", " ", "#"], [" ", " ", "#"], ["#", " ", "c"]],
word = "ca"
输出:true
解释:单词 "ca" 可以如上图放置(从右到左)。提示:
m == board.length
n == board[i].length
1 <= m * n <= 2 * 10^5
board[i][j] 可能为 ' ' ,'#' 或者一个小写英文字母。
1 <= word.length <= max(m, n)
word 只包含小写英文字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-word-can-be-placed-in-crossword
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 按题意模拟
class Solution {int m, n;
public:bool placeWordInCrossword(vector<vector<char>>& board, string word) {m = board.size(), n = board[0].size();for(int i = 0; i < m; ++i)if(check(board, i, word, 0))return true;for(int j = 0; j < n; ++j)if(check(board, j, word, 1))return true;return false;}bool check(vector<vector<char>>& b, int idx, string word, int flag){unordered_map<int,char> cp;//记录board位置上的字符映射关系if(flag == 0){int j = 0, len = 0;//len记录board有效的字符长度while(j < n){if(b[idx][j] == '#' || j == n-1){ // 遇到结束符号if(isalpha(b[idx][j])){cp[len] = b[idx][j];}if(b[idx][j] != '#')len++;if(check(cp, len, word))return true;cp.clear();len = 0;}else if(b[idx][j] == ' ')len++;else{cp[len] = b[idx][j];len++;}j++;}}else{int i = 0, len = 0;while(i < m){if(b[i][idx] == '#' || i == m-1){if(isalpha(b[i][idx])){cp[len] = b[i][idx];}if(b[i][idx] != '#')len++;if(check(cp, len, word))return true;cp.clear();len = 0;}else if(b[i][idx] == ' ')len++;else{cp[len] = b[i][idx];len++;}i++;}}return false;}bool check(unordered_map<int,char> &cp, int len, string& word){if(len != word.size())return false;//长度不等,不能if(cp.size() == 0) return true;bool flag1 = true, flag2 = true;//正反顺序都可以进行检查for(auto& x : cp){if(word[x.first] != x.second)//正序{flag1 = false;break;}}if(flag1) return true;for(auto& x : cp){if(word[len-1-x.first] != x.second) // 逆序检查{flag2 = false;break;}}return flag2;}
};
336 ms 414.9 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)相关推荐
- 5883. 判断单词是否能放入填字游戏内
给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态.填字游戏格子中包含小写英文字母(已填入的单词),表示 空 格的 ' ' 和表示 障碍 格子的 '#' . 如果满足以下条件 ...
- html同时播放多个文件夹,怎么把很多文件一起同时放入一个文件夹内
2005-07-28 怎样才能把想要的资料放到我的文件夹里我 最简单的方法是点文件选项,选择另存为时会跳出一个画面,如图001,这时你可以找到"保存在",后面就是你想存放文件的路径 ...
- n个小球放入m个盒子中_飞么盒子卫生巾自助售卖机前景
嘿,你有没有经历过,出门在外来大姨妈却没带M巾呢? 尴尬丛生的你选择怎么做? 现在,有了新选择,这也是今天我们迫不及待想要和你们介绍的新朋友-飞么盒子,由Faimes飞么品牌自主研发出品的卫生巾售卖机 ...
- 生成随机数放入整型数组怎么判断有没有重复_图的应用(1)-连通图的最小生成树(Prim算法和Kruskal算法)...
连通图的生成树: 是一个极小的连通图,它含有图中全部的N个顶点,但是只足以构成一颗树的N-1条边. 必须满足三个条件: 图是连通图: 图中包含了N个结点 图中边的数量等于N-1条. 连通图生成树的判断 ...
- linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
#!/bin/bash #业务实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件 # #文件名FilePath 文件内容如下 #bjzhadmin15254160859 ...
- 在Vim中有没有一种方法可以在不将文本放入寄存器的情况下删除?
使用Vim我经常想用我刚刚拉出的块替换代码块. 但是当我删除要替换的代码块时,该块本身会进入寄存器,该寄存器会擦除我刚刚移动的块. 所以我习惯了yanking,然后插入,然后删除我不想要的东西,但是对 ...
- java sessionid放入cookie_sessionID和cookie
一.cookie机制和session机制的区别 **************************************************************************** ...
- 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )
文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...
- java怎么把随机数放入数组_Java学习:集合的使用与数组的区别
ArrayList 集合 ArrayList 集合 ArrayList list = new ArrayList<>(); 对于ArrayList来说,有一个尖括号代表泛型. 泛型:也就是 ...
最新文章
- 重塑技术引擎 阿里落地全球最大规模云原生实践支撑双11
- c++中实现delphi的按类名生成类对象
- 2021.02.05 Visual QA论文阅读
- 【java图文趣味版】数组元素的访问与遍历
- jQuery表单校验
- 安装 深度wine_深度系统更新(2020.11.25)
- Tomcat文件配置
- for循环及break和continue的区别
- slf4j相关的配置信息
- Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)
- 大学计算机绘图实训报告,CAD制图实训心得体会范文4篇
- html怎样设置图片的圆角矩形,怎么把矩形变成圆角 ps怎么在原来的矩形中改成圆角...
- 【线性代数之二】矩阵与行列式
- 测试框架 Mocha 实例教程
- 愚人节导入_在愚人节的恶作剧破坏之后,如何重置键盘的映射?
- 中国电信再发力:推出最新七大惠民惠企新举措
- 搭建直播平台过程中的全能“辅助”——流媒体服务器...
- 大华监控服务器状态变更,大华监控存储设置教程
- 计算机网考里操作题发邮件,电大_全国计算机应用基础考试_网考内容_全部操作题(小条版)...
- stm32外设-DMA
热门文章
- 解决:Navicat for mysql 设置外键出错
- 解决:Please specify a different SDK name--PyCharm报错
- mysql 表的存储类型_MySQL数据表存储引擎类型及特性
- 驱动面试、笔试常见问题
- centos7配置Docker镜像加速器
- Android 监听耳机的插拔事件
- BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]
- 软件工程项目之摄影App
- 控制台中使用cstring和string
- Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测