LeetCode 0943. Find the Shortest Superstring Solution in Java, C++, Python & Go | Explanation + Code

CoderIndeed
0
0943. Find the Shortest Superstring

Description

Given an array of strings words, return the smallest string that contains each string in words as a substring. If there are multiple valid strings of the smallest length, return any of them.

You may assume that no string in words is a substring of another string in words.

 

Example 1:

Input: words = ["alex","loves","leetcode"]
Output: "alexlovesleetcode"
Explanation: All permutations of "alex","loves","leetcode" would also be accepted.

Example 2:

Input: words = ["catg","ctaagt","gcta","ttca","atgcatc"]
Output: "gctaagttcatgcatc"

 

Constraints:

  • 1 <= words.length <= 12
  • 1 <= words[i].length <= 20
  • words[i] consists of lowercase English letters.
  • All the strings of words are unique.

Solutions

Solution 1

PythonJavaC++Go
class Solution: def shortestSuperstring(self, words: List[str]) -> str: n = len(words) g = [[0] * n for _ in range(n)] for i, a in enumerate(words): for j, b in enumerate(words): if i != j: for k in range(min(len(a), len(b)), 0, -1): if a[-k:] == b[:k]: g[i][j] = k break dp = [[0] * n for _ in range(1 << n)] p = [[-1] * n for _ in range(1 << n)] for i in range(1 << n): for j in range(n): if (i >> j) & 1: pi = i ^ (1 << j) for k in range(n): if (pi >> k) & 1: v = dp[pi][k] + g[k][j] if v > dp[i][j]: dp[i][j] = v p[i][j] = k j = 0 for i in range(n): if dp[-1][i] > dp[-1][j]: j = i arr = [j] i = (1 << n) - 1 while p[i][j] != -1: i, j = i ^ (1 << j), p[i][j] arr.append(j) arr = arr[::-1] vis = set(arr) arr.extend([j for j in range(n) if j not in vis]) ans = [words[arr[0]]] + [words[j][g[i][j] :] for i, j in pairwise(arr)] return ''.join(ans)(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !