Python程序:统计从字母矩阵中可以生成的单词数量


假设我们有一个 4 x 4 的字母棋盘和一个单词列表,我们需要找到在棋盘上可以生成的最多单词数量,这些单词可以通过相邻字母的序列生成,每个单词最多只能使用每个单元格一次(但我们可以重复使用单元格来生成其他单词)。我们可以向上、向下、向左、向右或对角线方向移动。

因此,如果输入如下所示:

mbfd
xaya
tztr
sqqq

words = ["bat", "far", "mat"],则输出将为 3,因为我们可以生成 mat [0,1] → [1,1] → [2,0],bat [0,2] → [1,1] → [2,2],以及 far [0,2] → [1,3] → [2,3]。

为了解决这个问题,我们将遵循以下步骤:

  • N := A 的行数,M := A 的列数

  • trie := 一个新的映射

  • 对于 words 中的每个单词,执行以下操作:

    • current := trie

    • 对于单词中的每个字符 c,执行以下操作:

      • 如果 c 在 current 中,则

        • current := current[c]

      • 否则,

        • current[c] := 一个新的映射

        • current := current[c]

    • current["*"] := True

  • ans := 0

  • 定义一个函数 dfs()。它将接收 x、y 和 d 作为参数。

  • 如果 "*" 在 d 中,则

    • 删除 d["*"]

    • ans := ans + 1

  • temp := A[x, y]

  • A[x, y] := "#"

  • 对于 [x - 1, x, x + 1] 中的每个元素 i,执行以下操作:

    • 对于 [y - 1, y, y + 1] 中的每个元素 j,执行以下操作:

      • 如果 i 和 j 在矩阵范围内,并且 A[i, j] 在 d 中,则

        • dfs(i, j, d[A[i, j]])

  • A[x, y] := temp

  • 在主方法中执行以下操作:

  • 对于从 0 到 N 的范围内的 i,执行以下操作:

    • 对于从 0 到 M 的范围内的 j,执行以下操作:

      • 如果 A[i][j] 在 trie 中,则

        • dfs(i, j, trie[A[i, j]])

  • 返回 ans

示例(Python)

让我们看一下以下实现,以便更好地理解:

 在线演示

class Solution:
   def solve(self, A, words):
      N = len(A)
      M = len(A[0])
      trie = dict()
      for word in words:
         current = trie
         for c in word:
            if c in current:
               current = current[c]
            else:
               current[c] = dict()
               current = current[c]
         current["*"] = True
      ans = 0
      def dfs(x, y, d):
         nonlocal ans
         if "*" in d:
            del d["*"]
            ans += 1
         temp = A[x][y]
         A[x][y] = "#"
         for i in [x - 1, x, x + 1]:
            for j in [y - 1, y, y + 1]:
               if 0 <= i < N and 0 <= j < M and A[i][j] in d: dfs(i, j, d[A[i][j]])
         A[x][y] = temp
      for i in range(N):
         for j in range(M):
            if A[i][j] in trie:
               dfs(i, j, trie[A[i][j]])
      return ans
ob = Solution()
matrix = [
   ["m", "b", "f", "d"],
   ["x", "a", "y", "a"],
   ["t", "z", "t", "r"],
   ["s", "q", "q", "q"]
]
words = ["bat", "far", "mat"]
print(ob.solve(matrix, words))

输入

[
["m", "b", "f", "d"],
["x", "a", "y", "a"],
["t", "z", "t", "r"],
["s", "q", "q", "q"] ],
["bat", "far", "mat"]

输出

3

更新于: 2020-12-22

215 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告