TGViewer
PHP | LeetCode PHP | LeetCode @easy_php_task · 1.33K subscribers
Post #1149 126
Задача: 425. Word Squares
Сложность: hard

Дан массив уникальных строк words, верните все квадраты слов, которые можно построить из этих слов. Одно и то же слово из words можно использовать несколько раз. Вы можете вернуть ответ в любом порядке.

Последовательность строк образует допустимый квадрат слов, если k-я строка и k-й столбец читаются одинаково, где 0 <= k < max(количество строк, количество столбцов).

Например, последовательность слов ["ball", "area", "lead", "lady"] образует квадрат слов, потому что каждое слово читается одинаково как по горизонтали, так и по вертикали.

Пример:
Input: words = ["area","lead","wall","lady","ball"]
Output: [["ball","area","lead","lady"],["wall","area","lead","lady"]]
Explanation:
The output consists of two word squares. The order of output does not matter (just the order of words in each word square matters).


👨‍💻 Алгоритм:

1⃣Постройте хеш-таблицу из входных слов. Функция buildPrefixHashTable(words) создает хеш-таблицу, где ключами являются префиксы, а значениями - списки слов, начинающихся с этих префиксов.

2⃣При помощи функции getWordsWithPrefix(prefix) осуществляйте запросы к хеш-таблице для получения всех слов, обладающих данным префиксом. Это ускоряет поиск подходящих слов для построения квадрата слов.

3⃣Используйте алгоритм с возвратом для построения квадрата слов. В каждый момент времени проверьте, совпадают ли строки и столбцы. Если они совпадают, продолжайте добавлять слова; если нет, вернитесь к предыдущему состоянию и попробуйте другое слово.

😎 Решение:
class Solution {
private $N = 0;
private $words = [];
private $prefixHashTable = [];

function wordSquares($words) {
$this->words = $words;
$this->N = strlen($words[0]);

$results = [];
$this->buildPrefixHashTable($words);

foreach ($words as $word) {
$wordSquares = [$word];
$this->backtracking(1, $wordSquares, $results);
}
return $results;
}

function backtracking($step, &$wordSquares, &$results) {
if ($step == $this->N) {
$results[] = $wordSquares;
return;
}

$prefix = '';
foreach ($wordSquares as $word) {
$prefix .= $word[$step];
}

foreach ($this->getWordsWithPrefix($prefix) as $candidate) {
$wordSquares[] = $candidate;
$this->backtracking($step + 1, $wordSquares, $results);
array_pop($wordSquares);
}
}

function buildPrefixHashTable($words) {
foreach ($words as $word) {
for ($i = 1; $i < $this->N; $i++) {
$prefix = substr($word, 0, $i);
if (!isset($this->prefixHashTable[$prefix])) {
$this->prefixHashTable[$prefix] = [];
}
$this->prefixHashTable[$prefix][] = $word;
}
}
}

function getWordsWithPrefix($prefix) {
return isset($this->prefixHashTable[$prefix]) ? $this->prefixHashTable[$prefix] : [];
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_php_task
  1. Oct 14, 2026Задача: 674. Longest Continuous Increasing Subsequence Сложность: easy Дан неотсортированн…
  2. Oct 13, 2026Задача: 899. Orderly Queue Сложность: hard Вам дана строка s и целое число k. Вы можете вы…
  3. Oct 11, 2026Задача: 913. Cat and Mouse4 Сложность: hard В игру на неориентированном графе играют два и…
  4. Oct 9, 2026Задача: 71. Simplify Path Сложность: medium Дан абсолютный путь для файловой системы в сти…
  5. Oct 7, 2026🔥 Скрытые вакансии с удаленной работой для PHP разработчика, которые нигде больше не публ…
  6. Oct 6, 2026Задача: 166. Fraction to Recurring Decimal Сложность: medium Даны два целых числа, предста…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →