Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Word Search II ใน Python


สมมติว่าเรามีกระดาน 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']