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

Word Search II ใน Python

กำหนดบอร์ด 2D และลิสต์คำศัพท์ ต้องหาคำทั้งหมดที่ปรากฏบนบอร์ด โดยตัวอักษรต้องติดกันแนวนอนหรือแนวตั้ง และแต่ละเซลล์ใช้ได้สูงสุด 1 ครั้งต่อคำ

ตัวอย่าง: บอร์ด 4x4, words = ["oath","pea","tea","rain"] → output ["oath","tea"]

ขั้นตอนการแก้ปัญหา

  • สร้าง Trie (prefix tree) จากลิสต์คำศัพท์
  • DFS จากทุกเซลล์บนบอร์ด ตาม Trie
  • เมื่อเจอคำที่จบ (mark '#') เพิ่มในผลลัพธ์ และ mark ไม่ให้เจอซ้ำ
  • Backtracking: mark เซลล์ปัจจุบันเป็น '*' ระหว่าง DFS แล้วคืนค่าเดิม

ตัวอย่างโค้ด

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']