• Weekly Contest 111-------->943. Find the Shortest Superstring(can't understand)


    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();
        }
    }
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    slf4j日志框架绑定机制
    Btrace使用入门
    JVM反调调用优化,导致发生大量异常时log4j2线程阻塞
    [转载]Javassist 使用指南(三)
    [转载]Javassist 使用指南(二)
    [转载]Javassist 使用指南(一)
    数组升序排序的方法Arrays.sort();的应用
    copyOfRange的应用
    copyOf数组复制方法的使用(数组扩容练习)
    binarySearch(int[] a,int fromIndex,int toIndex, int key)的用法
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9979731.html
Copyright © 2020-2023  润新知