33
33
"""
34
34
35
35
36
+ def get_point_key (len_board : int , len_board_column : int , row : int , column : int ) -> int :
37
+ """
38
+ Returns the hash key of matrix indexes.
39
+
40
+ >>> get_point_key(10, 20, 1, 0)
41
+ 200
42
+ """
43
+
44
+ return len_board * len_board_column * row + column
45
+
46
+
47
+ def exits_word (
48
+ board : list [list [str ]],
49
+ word : str ,
50
+ row : int ,
51
+ column : int ,
52
+ word_index : int ,
53
+ visited_points_set : set [int ],
54
+ ) -> bool :
55
+ """
56
+ Return True if it's possible to search the word suffix
57
+ starting from the word_index.
58
+
59
+ >>> exits_word([["A"]], "B", 0, 0, 0, set())
60
+ False
61
+ """
62
+
63
+ if board [row ][column ] != word [word_index ]:
64
+ return False
65
+
66
+ if word_index == len (word ) - 1 :
67
+ return True
68
+
69
+ traverts_directions = [(0 , 1 ), (0 , - 1 ), (- 1 , 0 ), (1 , 0 )]
70
+ len_board = len (board )
71
+ len_board_column = len (board [0 ])
72
+ for direction in traverts_directions :
73
+ next_i = row + direction [0 ]
74
+ next_j = column + direction [1 ]
75
+ if not (0 <= next_i < len_board and 0 <= next_j < len_board_column ):
76
+ continue
77
+
78
+ key = get_point_key (len_board , len_board_column , next_i , next_j )
79
+ if key in visited_points_set :
80
+ continue
81
+
82
+ visited_points_set .add (key )
83
+ if exits_word (board , word , next_i , next_j , word_index + 1 , visited_points_set ):
84
+ return True
85
+
86
+ visited_points_set .remove (key )
87
+
88
+ return False
89
+
90
+
36
91
def word_exists (board : list [list [str ]], word : str ) -> bool :
37
92
"""
38
93
>>> word_exists([["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], "ABCCED")
@@ -77,6 +132,8 @@ def word_exists(board: list[list[str]], word: str) -> bool:
77
132
board_error_message = (
78
133
"The board should be a non empty matrix of single chars strings."
79
134
)
135
+
136
+ len_board = len (board )
80
137
if not isinstance (board , list ) or len (board ) == 0 :
81
138
raise ValueError (board_error_message )
82
139
@@ -94,61 +151,12 @@ def word_exists(board: list[list[str]], word: str) -> bool:
94
151
"The word parameter should be a string of length greater than 0."
95
152
)
96
153
97
- traverts_directions = [(0 , 1 ), (0 , - 1 ), (- 1 , 0 ), (1 , 0 )]
98
- len_word = len (word )
99
- len_board = len (board )
100
154
len_board_column = len (board [0 ])
101
-
102
- # Returns the hash key of matrix indexes.
103
- def get_point_key (row : int , column : int ) -> int :
104
- """
105
- >>> len_board=10
106
- >>> len_board_column=20
107
- >>> get_point_key(0, 0)
108
- 200
109
- """
110
-
111
- return len_board * len_board_column * row + column
112
-
113
- # Return True if it's possible to search the word suffix
114
- # starting from the word_index.
115
- def exits_word (
116
- row : int , column : int , word_index : int , visited_points_set : set [int ]
117
- ) -> bool :
118
- """
119
- >>> board=[["A"]]
120
- >>> word="B"
121
- >>> exits_word(0, 0, 0, set())
122
- False
123
- """
124
-
125
- if board [row ][column ] != word [word_index ]:
126
- return False
127
-
128
- if word_index == len_word - 1 :
129
- return True
130
-
131
- for direction in traverts_directions :
132
- next_i = row + direction [0 ]
133
- next_j = column + direction [1 ]
134
- if not (0 <= next_i < len_board and 0 <= next_j < len_board_column ):
135
- continue
136
-
137
- key = get_point_key (next_i , next_j )
138
- if key in visited_points_set :
139
- continue
140
-
141
- visited_points_set .add (key )
142
- if exits_word (next_i , next_j , word_index + 1 , visited_points_set ):
143
- return True
144
-
145
- visited_points_set .remove (key )
146
-
147
- return False
148
-
149
155
for i in range (len_board ):
150
156
for j in range (len_board_column ):
151
- if exits_word (i , j , 0 , {get_point_key (i , j )}):
157
+ if exits_word (
158
+ board , word , i , j , 0 , {get_point_key (len_board , len_board_column , i , j )}
159
+ ):
152
160
return True
153
161
154
162
return False
0 commit comments