943. Find the Shortest Superstring
阿新 • • 發佈:2018-12-02
Given an array A of strings, find any smallest string that contains each string in A
as a substring.
We may assume that no string in A
is substring of another string in A
.
Example 1:
Input: ["alex","loves","leetcode"] Output: "alexlovesleetcode" Explanation:All permutations of "alex","loves","leetcode" would also be accepted.
Example 2:
Input: ["catg","ctaagt","gcta","ttca","atgcatc"] Output: "gctaagttcatgcatc"
Note:
1 <= A.length <= 12
1 <= A[i].length <= 20
思路:其實就是TSP問題,用狀壓DP。比賽的時候想到最小生成樹上去了,尷尬
https://leetcode.com/articles/find-the-shortest-superstring/
#import heapq class Solution: def shortestSuperstring(self, A): """ :type A: List[str] :rtype: str """ n=len(A) adj=[[0 for _ in range(n)] for _ in range(n)] def helper(s1,s2): ma=min(len(s1),len(s2)) for k in range(ma,0,-1): if s1[len(s1)-k:]==s2[:k]: return k return 0 for i in range(n): for j in range(n): if i==j: continue adj[i][j]=helper(A[i],A[j]) dp=[[-1 for _ in range(n)] for _ in range(2**n)] path=[[-1 for _ in range(n)] for _ in range(2**n)] for mask in range(2**n): for bit in range(n): if mask&(1<<bit): mask2 = mask^(1<<bit) if mask2==0: dp[mask][bit]=0 continue for i in range(n): if mask2&(1<<i): t = dp[mask2][i]+adj[i][bit] if t>dp[mask][bit]: dp[mask][bit] = t path[mask][bit]=i mask = 2**n-1 s = dp[mask].index(max(dp[mask])) res=[] while len(res)<n: res.append(s) s = path[mask][s] mask = mask^(1<<res[-1]) res=res[::-1] s = A[res[0]] for i in range(1,n): s+=A[res[i]][adj[res[i-1]][res[i]]:] return s s=Solution() print(s.shortestSuperstring( ["yeeiebcz","qbqhdytk","ygueikth","thqzyeei","gyygueikt","ikthqzyee"])) print(s.shortestSuperstring( ["alex","loves","leetcode"])) #print(s.shortestSuperstring( ["catg","ctaagt","gcta","ttca","atgcatc"])) #print(s.shortestSuperstring(["ift","efd","dnete","tef","fdn"]))