WordSearchII   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 47
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 13
eloc 27
c 2
b 0
f 0
dl 0
loc 47
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
B dfs() 0 28 9
A findWords() 0 15 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace leetcode;
6
7
use leetcode\util\Trie;
8
9
class WordSearchII
10
{
11
    public static function findWords(array $board, array $words): array
12
    {
13
        $ans = $visited = [];
14
        $trie = new Trie();
15
        foreach ($words as $word) {
16
            $trie->insert($word);
17
        }
18
        [$m, $n] = [count($board), count($board[0])];
19
        for ($i = 0; $i < $m; $i++) {
20
            for ($j = 0; $j < $n; $j++) {
21
                self::dfs($board, $visited, '', $i, $j, $trie, $ans);
22
            }
23
        }
24
25
        return $ans;
26
    }
27
28
    private static function dfs(array $board, array &$visited, string $s, int $i, int $j, Trie $trie, array &$ans)
29
    {
30
        [$m, $n, $default] = [count($board), count($board[0]), []];
31
        if ($i < 0 || $i >= $m || $j < 0 || $j >= $n) {
32
            return $default;
33
        }
34
35
        if (isset($visited[$i][$j]) && $visited[$i][$j]) {
36
            return $default;
37
        }
38
39
        $s .= $board[$i][$j];
40
        if (!$trie->startsWith($s)) {
41
            return $default;
42
        }
43
44
        if ($trie->search($s)) {
45
            $ans[] = $s;
46
        }
47
48
        $visited[$i][$j] = true;
49
        self::dfs($board, $visited, $s, $i - 1, $j, $trie, $ans);
50
        self::dfs($board, $visited, $s, $i + 1, $j, $trie, $ans);
51
        self::dfs($board, $visited, $s, $i, $j - 1, $trie, $ans);
52
        self::dfs($board, $visited, $s, $i, $j + 1, $trie, $ans);
53
        $visited[$i][$j] = false;
54
55
        return $ans;
56
    }
57
}
58