日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/7/5 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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. 判断单词是否能放入填字游戏内(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。