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. 1 <= A.length <= 12
  2. 1 <= A[i].length <= 20

Approach #1:

class Solution {
public String shortestSuperstring(String[] A) {
int N = A.length; int [][] overlaps = new int[N][N];
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
int m = Math.min(A[i].length(), A[j].length());
for (int k = m; k >= 0; --k) {
if (A[i].endsWith(A[j].substring(0, k))) {
overlaps[i][j] = k;
break;
}
}
}
} int[][] dp = new int[1<<N][N];
int[][] parent = new int[1<<N][N];
for (int mask = 0; mask < (1<<N); ++mask) {
Arrays.fill(parent[mask], -1); for (int bit = 0; bit < N; ++bit) if (((mask >> bit) & 1) > 0) {
int pmask = mask ^ (1 << bit);
if (pmask == 0) continue;
for (int i = 0; i < N; ++i) if (((pmask >> i) & 1) > 0){
int val = dp[pmask][i] + overlaps[i][bit];
if (val > dp[mask][bit]) {
dp[mask][bit] = val;
parent[mask][bit] = i;
}
}
}
} int[] perm = new int[N];
boolean[] seen = new boolean[N];
int t = 0;
int mask = (1 << N) - 1; int p = 0;
for (int j = 0; j < N; ++j)
if (dp[(1 << N) - 1][j] > dp[(1 << N) - 1][p])
p = j; while (p != -1) {
perm[t++] = p;
seen[p] = true;
int p2 = parent[mask][p];
mask ^= 1 << p;
p = p2;
} for (int i = 0; i < t/2; ++i) {
int v = perm[i];
perm[i] = perm[t-1-i];
perm[t-1-i] = v;
} for (int i = 0; i < N; ++i) if (!seen[i])
perm[t++] = i; StringBuilder ans = new StringBuilder(A[perm[0]]);
for (int i = 1; i < N; ++i) {
int overlap = overlaps[perm[i-1]][perm[i]];
ans.append(A[perm[i]].substring(overlap));
} return ans.toString();
}
}

  

最新文章

  1. 软件工程(FZU2015)赛季得分榜,第四回合
  2. sass、less和stylus的安装使用和入门实践
  3. swift的运算符
  4. Sql Server2005恢复备份数据库问题-Error:3154 3219
  5. sd卡文件操作
  6. 银河麒麟操作系统打开VMware报vmmon无法编译
  7. 『OGG 03』Win7 配置 Oracle GoldenGate 一次性成功(包括Adapter Java)
  8. Unity插件系列之二维码
  9. [Oracle][DATAGUARD] LOGICAL STANDBY环境里,有些SEQUENCE无法应用,导致Primary和Standby无法同期
  10. SpringBoot开源项目(企业信息化基础平台)
  11. Xamarin Essentials教程设备信息DeviceInfo
  12. Win10添加右键在此处打开命令行
  13. 【Static Program Analysis - Chapter 2】 代码的表征之抽象语法树
  14. VKD224B触摸芯片调试笔记
  15. .net event 使用 Action
  16. (GoRails) 使用ActiveStorage给user添加上传头像功能。
  17. How to update XENTRY Connect C5 software with .iso file
  18. Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解【转】
  19. asp.net c# repeater或gridview导出EXCEL的详细代码。
  20. python 同时迭代多个序列

热门文章

  1. Linux 系统编程中环境变量的使用
  2. “checkbox”和“select”对象在javascript和jquery的操作差异做了整理
  3. [Phoenix] 四、加盐表
  4. go网关
  5. java读流方式,下载网络上的图片
  6. Ace(二)Demo示例
  7. JavaScript学习第三天
  8. UVA10129 Play on Words —— 欧拉回路
  9. Spring Boot2.0之 整合Zookeeper集群
  10. 关于RHEL5中yum挂载iso源引起的问题(转)