Find the Shortest Superstring LeetCode solution in Python
1class Solution:2def shortestSuperstring(self, words: List[str]) -> str:3n = len(words)4graph = [[0] * n for _ in range(n)] # graph as adjacency matrix56for i in range(n):7for j in range(n):8if i != j:9for k in range(len(words[j])):10if words[i].endswith(words[j][:k]):11graph[i][j] = len(words[j]) - k1213@cache14def fn(prev, mask):15"""Return length of shortest superstring & current choice of word."""16if mask == 0:17return 0, None18vv, kk = inf, None19for k in range(n):20if mask & 1 << k:21v, _ = fn(k, mask ^ 1 << k)22offset = len(words[k]) if prev == -1 else graph[prev][k]23if v + offset < vv:24vv, kk = v + offset, k25return vv, kk2627ans = []28prev = -129mask = (1 << n) - 130while mask:31_, k = fn(prev, mask)32if ans:33ans.append(words[k][-graph[prev][k] :])34else:35ans.append(words[k])36prev = k37mask ^= 1 << k38return "".join(ans)