สมมติว่าเรามีกระดาน 2 มิติและรายการคำศัพท์ ดังนั้นจากพจนานุกรม เราจึงต้องค้นหาคำทั้งหมดในกระดาน ในที่นี้ แต่ละคำจะต้องสร้างจากตัวอักษรของเซลล์ที่อยู่ติดกันตามลำดับ โดยที่เซลล์ที่อยู่ติดกันคือเซลล์ที่อยู่ใกล้เคียงในแนวนอนหรือแนวตั้ง เราต้องจำไว้ว่าไม่สามารถใช้เซลล์ตัวอักษรเดียวกันมากกว่าหนึ่งครั้งในหนึ่งคำ
ดังนั้นหากอินพุตเป็นแบบ −
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สร้างผลลัพธ์อาร์เรย์
-
กำหนดวิธีการที่เรียกว่า Solve() ซึ่งจะใช้ board, d, i, j s
-
เมื่อ i หรือ j ไม่อยู่ในช่วงแถวของบอร์ดและคอลัมน์ตามลำดับ ให้คืนค่าเท็จ
-
l :=board[i, j]
-
ถ้า l มีอยู่ใน d แล้ว
-
d :=d[l], เชื่อม l กับ s
-
ถ้า # อยู่ใน d และ d[#] ไม่เป็นค่าว่าง ดังนั้น
-
แทรก s ลงในผลลัพธ์
-
ตั้งค่า d[#] :=0
-
-
กระดาน[i, j] :=*
-
ถ้า i+1 <จำนวนแถวในบอร์ดและบอร์ด[i + 1, j] ใน d แล้ว
-
แก้การโทร (บอร์ด, d, i + 1, j, s)
-
-
ถ้า j+1 <จำนวนคอลัมน์ในบอร์ดและบอร์ด[i, j+1] ใน d แล้ว
-
โทรแก้(กระดาน, d, ผม, j+1, s)
-
-
ถ้า i-1> 0 และบอร์ด[i - 1, j] ใน d แล้ว
-
แก้การโทร (บอร์ด, d, i - 1, j, s)
-
-
ถ้า j-1> 0 และ board[i, j-1] ใน d แล้ว
-
โทรแก้(บอร์ด, d, ผม, j-1, s)
-
-
กระดาน[i, j] :=l
-
-
กำหนดวิธีการหนึ่งที่เรียกว่า insert() ซึ่งจะใช้คำและพจนานุกรม t
-
ปัจจุบัน :=t
-
สำหรับฉันในคำ
-
ถ้าฉันไม่ได้อยู่ในปัจจุบัน แล้ว current[i] :=แผนที่ใหม่
-
ปัจจุบัน :=ปัจจุบัน[i]
-
-
ปัจจุบัน[#] :=1
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
สร้างแผนที่ t
-
สำหรับคำในคำ:call insert(word, t)
-
สำหรับแต่ละเซลล์ i, j ในบอร์ด − call Solve(บอร์ด, t, i, j)
-
ส่งคืนผลลัพธ์
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution(object):
def findWords(self, board, words):
self.result = []
t = {}
for word in words:
self.insert(word,t)
for i in range(len(board)):
for j in range(len(board[0])):
self.solve(board,t,i,j)
return self.result
def solve(self,board,d,i,j,s=""):
if i<0 or j<0 or i>=len(board) or j>=(len(board[0])):
return
l = board[i][j]
if l in d:
d = d[l]
s+=l
if "#" in d and d['#']:
self.result.append(s)
d['#'] = 0
board[i][j] = '*'
if i+1<len(board) and board[i+1][j] in d :
self.solve(board,d,i+1,j,s)
if j+1 < len(board[0]) and board[i][j+1] in d:
self.solve(board,d,i,j+1,s)
if i-1>=0 and board[i-1][j] in d :
self.solve(board,d,i-1,j,s)
if j-1>=0 and board[i][j-1] in d :
self.solve(board,d,i,j-1,s)
board[i][j] = l
def insert(self, word,t):
current = t
for i in word:
if i not in current:
current[i] = {}
current =current[i]
current['#']=1
ob = Solution()
print(ob.findWords([["o","a","a","n"],["e","t","e","a"],["i","h","k", "r"],["i","f","l","v"]],["oath","pea","tea","rain"])) อินพุต
[["o","a","a","n"], ["e","t","e","a"], ["i","h","k","r"], ["i","f","l","v"]], ["oath","pea","tea","rain"]
ผลลัพธ์
['oath', 'tea']