文章目录

  • 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. 判断单词是否能放入填字游戏内(模拟)相关推荐

  1. 5883. 判断单词是否能放入填字游戏内

    给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态.填字游戏格子中包含小写英文字母(已填入的单词),表示 空 格的 ' ' 和表示 障碍 格子的 '#' . 如果满足以下条件 ...

  2. html同时播放多个文件夹,怎么把很多文件一起同时放入一个文件夹内

    2005-07-28 怎样才能把想要的资料放到我的文件夹里我 最简单的方法是点文件选项,选择另存为时会跳出一个画面,如图001,这时你可以找到"保存在",后面就是你想存放文件的路径 ...

  3. n个小球放入m个盒子中_飞么盒子卫生巾自助售卖机前景

    嘿,你有没有经历过,出门在外来大姨妈却没带M巾呢? 尴尬丛生的你选择怎么做? 现在,有了新选择,这也是今天我们迫不及待想要和你们介绍的新朋友-飞么盒子,由Faimes飞么品牌自主研发出品的卫生巾售卖机 ...

  4. 生成随机数放入整型数组怎么判断有没有重复_图的应用(1)-连通图的最小生成树(Prim算法和Kruskal算法)...

    连通图的生成树: 是一个极小的连通图,它含有图中全部的N个顶点,但是只足以构成一颗树的N-1条边. 必须满足三个条件: 图是连通图: 图中包含了N个结点 图中边的数量等于N-1条. 连通图生成树的判断 ...

  5. linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件

    #!/bin/bash #业务实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件 # #文件名FilePath 文件内容如下 #bjzhadmin15254160859 ...

  6. 在Vim中有没有一种方法可以在不将文本放入寄存器的情况下删除?

    使用Vim我经常想用我刚刚拉出的块替换代码块. 但是当我删除要替换的代码块时,该块本身会进入寄存器,该寄存器会擦除我刚刚移动的块. 所以我习惯了yanking,然后插入,然后删除我不想要的东西,但是对 ...

  7. java sessionid放入cookie_sessionID和cookie

    一.cookie机制和session机制的区别 **************************************************************************** ...

  8. 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

    文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...

  9. java怎么把随机数放入数组_Java学习:集合的使用与数组的区别

    ArrayList 集合 ArrayList 集合 ArrayList list = new ArrayList<>(); 对于ArrayList来说,有一个尖括号代表泛型. 泛型:也就是 ...

最新文章

  1. 重塑技术引擎 阿里落地全球最大规模云原生实践支撑双11
  2. c++中实现delphi的按类名生成类对象
  3. 2021.02.05 Visual QA论文阅读
  4. 【java图文趣味版】数组元素的访问与遍历
  5. jQuery表单校验
  6. 安装 深度wine_深度系统更新(2020.11.25)
  7. Tomcat文件配置
  8. for循环及break和continue的区别
  9. slf4j相关的配置信息
  10. Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)
  11. 大学计算机绘图实训报告,CAD制图实训心得体会范文4篇
  12. html怎样设置图片的圆角矩形,怎么把矩形变成圆角 ps怎么在原来的矩形中改成圆角...
  13. 【线性代数之二】矩阵与行列式
  14. 测试框架 Mocha 实例教程
  15. 愚人节导入_在愚人节的恶作剧破坏之后,如何重置键盘的映射?
  16. 中国电信再发力:推出最新七大惠民惠企新举措
  17. 搭建直播平台过程中的全能“辅助”——流媒体服务器...
  18. 大华监控服务器状态变更,大华监控存储设置教程
  19. 计算机网考里操作题发邮件,电大_全国计算机应用基础考试_网考内容_全部操作题(小条版)...
  20. stm32外设-DMA

热门文章

  1. 解决:Navicat for mysql 设置外键出错
  2. 解决:Please specify a different SDK name--PyCharm报错
  3. mysql 表的存储类型_MySQL数据表存储引擎类型及特性
  4. 驱动面试、笔试常见问题
  5. centos7配置Docker镜像加速器
  6. Android 监听耳机的插拔事件
  7. BZOJ 2822: [AHOI2012]树屋阶梯 [Catalan数 高精度]
  8. 软件工程项目之摄影App
  9. 控制台中使用cstring和string
  10. Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测