2
* @param {string[]} words5
var longestStrChain = function (words) {6
let tiers = new Array(16);7
for (let i = 0; i < tiers.length; i++) tiers[i] = [];8
for (let word of words) tiers[word.length - 1].push({ word, len: 1 });10
const isPredecessor = function (word1, word2) {11
// Assumes word2.length = word1.length+114
for (let w2p = 0; w2p < word2.length; w2p++) {15
if (word2[w2p] !== word1[w1p]) {16
if (misses === 1) return false;20
if (w1p === word1.length) return true;26
for (let i = tiers.length - 1; i > 0; i--) {27
for (let w2 = 0; w2 < tiers[i].length; w2++) {28
for (let w1 = 0; w1 < tiers[i - 1].length; w1++) {29
if (tiers[i - 1][w1].len >= tiers[i][w2].len + 1) continue;30
if (isPredecessor(tiers[i - 1][w1].word, tiers[i][w2].word))31
tiers[i - 1][w1].len = tiers[i][w2].len + 1;37
for (let i = 0; i < tiers.length; i++) {38
for (let j = 0; j < tiers[i].length; j++)39
max = Math.max(max, tiers[i][j].len);