1
var shortestSuperstring = function (words) {4
edges = Array.from({ length: N }, () => new Uint8Array(N));6
// Build the edge graph7
for (let i = 0, word = words; i < N; i++) {9
for (let k = 1; k < word.length; k++) {10
let sub = word.slice(k);11
if (suffixes.has(sub)) suffixes.get(sub).push(i);12
else suffixes.set(sub, [i]);15
for (let j = 0; j < N; j++) {17
for (let k = 1; k < word.length; k++) {18
let sub = word.slice(0, k);19
if (suffixes.has(sub))20
for (let i of suffixes.get(sub)) edges[i][j] = Math.max(edges[i][j], k);24
// Initialize DP array26
dp = Array.from({ length: M }, () => new Uint16Array(1 << M));28
// Helper function to find the best value for dp[curr][currSet]29
// Store the previous node with bit manipulation for backtracking30
const solve = (curr, currSet) => {31
let prevSet = currSet - (1 << curr),34
if (!prevSet) return (edges[M][curr] << 4) + M;35
for (let prev = 0; prev < M; prev++)36
if (prevSet & (1 << prev)) {37
let overlap = edges[prev][curr] + (dp[prev][prevSet] >> 4);38
if (overlap >= bestOverlap) (bestOverlap = overlap), (bestPrev = prev);40
return (bestOverlap << 4) + bestPrev;43
// Build DP using solve44
for (let currSet = 1; currSet < 1 << M; currSet++)45
for (let curr = 0; curr < N; curr++)46
if (currSet & (1 << curr)) dp[curr][currSet] = solve(curr, currSet);48
// Join the ends at index M49
let curr = solve(M, (1 << N) - 1) & ((1 << 4) - 1);51
// Build the circle by backtracking path info from dp52
// and find the best place to cut the circle54
currSet = (1 << M) - 1,56
lowOverlap = edges[curr][M],59
(prev = dp[curr][currSet] & ((1 << 4) - 1)), (currSet -= 1 << curr);60
let overlap = edges[prev][curr];61
if (overlap < lowOverlap)62
(lowOverlap = overlap), (bestStart = N - path.length);63
(curr = prev), path.unshift(curr);66
// Build and return ans by cutting the circle at bestStart68
for (let i = bestStart; i < bestStart + M; i++) {69
let curr = path[i % N],70
next = path[(i + 1) % N],72
ans.push(word.slice(0, word.length - edges[curr][next]));74
ans.push(words[path[(bestStart + M) % N]]);