LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)

简介: LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)

文章目录


1. 题目

2. 解题


1. 题目


给你一个 m x n 的矩阵 board ,它代表一个填字游戏 当前 的状态。

填字游戏格子中包含小写英文字母(已填入的单词),表示 空格 的 ' ' 和表示 障碍 格子的 '#' 。


如果满足以下条件,那么我们可以 水平 (从左到右 或者 从右到左)或 竖直 (从上到下 或者 从下到上)填入一个单词:


该单词不占据任何 '#' 对应的格子。

每个字母对应的格子要么是 ' ' (空格)要么与 board 中已有字母 匹配 。

如果单词是 水平 放置的,那么该单词左边和右边 相邻 格子不能为 ’ ’ 或小写英文字母。

如果单词是 竖直 放置的,那么该单词上边和下边 相邻 格子不能为 ’ ’ 或小写英文字母。

给你一个字符串 word ,如果 word 可以被放入 board 中,请你返回 true ,否则请返回 false 。

image.png

输入:board = [["#", " ", "#"], [" ", " ", "#"], ["#", "c", " "]], 
word = "abc"
输出:true
解释:单词 "abc" 可以如上图放置(从上往下)。

image.png

输入:board = [[" ", "#", "a"], [" ", "#", "c"], [" ", "#", "a"]], 
word = "ac"
输出:false
解释:无法放置单词,因为放置该单词后上方或者下方相邻格会有空格。

image.png

输入: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 只包含小写英文字母。


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++

相关文章
|
2月前
|
算法
Leetcode第45题(跳跃游戏II)
这篇博客文章讨论了如何使用贪心算法解决LeetCode第45题“跳跃游戏II”,目的是找到使用最少跳跃次数到达数组末尾的策略。
88 8
Leetcode第45题(跳跃游戏II)
|
4月前
|
算法
LeetCode第55题跳跃游戏
LeetCode第55题"跳跃游戏"的解题方法,通过记录当前最远可达到的位置并判断每个位置是否可达以及能否到达末尾,有效解决了跳跃至数组末尾的可行性问题。
LeetCode第55题跳跃游戏
|
2月前
Leetcode第55题(跳跃游戏)
LeetCode第55题“跳跃游戏”要求判断在一个非负整数数组中,从第一个位置出发,是否能够到达最后一个位置,其中每个位置的元素代表可跳跃的最大长度。
33 0
|
2月前
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
22 0
|
2月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
20 0
|
4月前
|
算法
LeetCode第58题最后一个单词的长度
LeetCode第58题"最后一个单词的长度"的解题方法,通过从字符串末尾向前遍历并计数非空格字符,直接得出最后一个单词的长度。
LeetCode第58题最后一个单词的长度
|
4月前
|
算法 JavaScript Python
【Leetcode刷题Python】79. 单词搜索和剑指 Offer 12. 矩阵中的路径
Leetcode第79题"单词搜索"的Python解决方案,使用回溯算法在给定的二维字符网格中搜索单词,判断单词是否存在于网格中。
52 4
|
4月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
54 1
|
4月前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
56 3
|
4月前
|
Python
【Leetcode刷题Python】生词本单词整理
文章提供了一个Python程序,用于帮助用户整理和排版生词本上的单词,包括去除重复单词、按字典序排序,并按照特定的格式要求进行打印排版。
46 3