前往
大廳
主題

LeetCode - 2018. Check if Word Can Be Placed In Crossword 解題心得

Not In My Back Yard | 2022-03-12 00:00:02 | 巴幣 0 | 人氣 204

題目連結:


題目意譯:
你被給定一個 m × n 的矩陣 board,代表著目前一個填字遊戲的當前狀態。填字遊戲包含著小寫英文字母(已解開的字詞)、' ' 代表任何空的格子以及 '#' 用來代表不得填空的格子。

一個字詞可以被水平地(左到右或右到左)或鉛直地(上到下或下到上)放置於 board 上,如果:
其不佔有一個包含著字元 '#' 的格子。
每個字母必須放置於 ' '(空的)格子上或是與已存於 board 的該位置上的字母相配。
如果該字詞被水平地放置則其左右皆不得有任何空格子 ' ' 或是其他小寫字母。
如果該字詞被鉛直地放置則其上下皆不得有任何空格子 ' ' 或是其他小寫字母。

給定一個字串 word,回傳真(True)如果 word 可以被放於 board 上;反之,回傳假(False)。

限制:
m == board.length
n == board[i].length
1 ≦ m × n ≦ 2 × 10 ^ 5
board[i][j] 只會是 ' ' 、 '#' 或是一個小寫英文字母。
1 ≦ word.length ≦ max(m, n)
word 只會包含小寫英文字母。



範例測資:
範例 1:
輸入: board = [["#", " ", "#"], [" ", " ", "#"], ["#", "c", " "]], word = "abc"
輸出: true
解釋: "abc" 這個字詞可以如上圖所示被放置(上到下)。

範例 2:
輸入: board = [[" ", "#", "a"], [" ", "#", "c"], [" ", "#", "a"]], word = "ac"
輸出: false
解釋: 不可能放入該字詞因為必定會有空格或是一個字母在上面或下面。

範例 3:
輸入: board = [["#", " ", "#"], [" ", " ", "#"], ["#", " ", "c"]], word = "ca"
輸出: true
解釋: "ca" 這個字詞可以如上圖所示被放置(右到左)。


解題思維:
掃過整個版面兩次。第一次找出所有水平方向兩個 '#' 之間(或是同一列中版面最左側到第一個 '#'以及最後一個 '#' 到版面最右側)夾住的空位,對於每一個這樣的空隙 S 我們就去判斷 word 可不可以剛剛好放到這個 S 上。

因此我們先判斷 S 的長度是否與 word 相等。如果不同則代表 word 要嘛放不進這個空隙中,要嘛就是放進去後會有多餘的空位;長度相同的話則我們有兩種放法,一種是由左到右放入 S 中、一種是從右到左。兩種都放放看可不可行,如果有其中一種可行就代表我們找到了一個 word 可以放到 board 中的位置,因此回傳真。

水平方向掃完之後如果沒有就改到找到鉛直方向的,方式類似上面的過程。如果兩個方向都掃過都找不到的話,則代表我們無法把 word 放到 board 之中。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作