生活随笔
收集整理的這篇文章主要介紹了
LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
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
;if(flag
== 0){int j
= 0, len
= 0;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. 判断单词是否能放入填字游戏内(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。