Advertisement
Guest User

Accepted Interview Bit Solution: Shortest common superstring

a guest
May 20th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.13 KB | None | 0 0
  1. public class Solution {
  2.     public int solve(ArrayList<String> A) {
  3.         int n = A.size();
  4.        
  5.         if(n == 1) return A.get(0).length();
  6.        
  7.         int [][] overlap = new int [n+1][n+1];
  8.         int [][] dp = new int [n+1][(1<<A.size())];
  9.        
  10.         for(int i=0; i<=n; i++) Arrays.fill(overlap[i], -1);
  11.         for(int i=0; i<=n; i++) Arrays.fill(dp[i], -1);
  12.        
  13.         int result = Integer.MAX_VALUE;
  14.         for(int i=0; i<A.size(); i++){
  15.             result = Math.min(result, solution(A, i, 0, dp, overlap));
  16.         }
  17.         return result;
  18.     }
  19.    
  20.     private int solution(ArrayList<String> A, int i, int mask, int [][] dp, int [][] overlap){
  21.        
  22.         if(dp[i][mask]!= -1) return dp[i][mask];
  23.        
  24.         int lastmask = (1<<A.size())-1;
  25.         if(mask == lastmask){
  26.             dp[i][mask] = A.get(i).length();
  27.             return dp[i][mask];
  28.         }
  29.        
  30.         int result = Integer.MAX_VALUE;
  31.         for(int j=0; j<A.size(); j++){
  32.             if((mask&(1<<j)) == 0){
  33.                 int value = solution(A, j, (mask|(1<<i)), dp, overlap) +
  34.                             findNonOverLappingLength(A, i, j, overlap);
  35.                 result = Math.min(result, value);
  36.             }
  37.         }
  38.        
  39.         dp[i][mask] = result;
  40.         return dp[i][mask];
  41.     }
  42.    
  43.    
  44.     private int findNonOverLappingLength(ArrayList<String> A, int x, int y, int [][] overlap){
  45.        
  46.         if(overlap[x][y] != -1) return overlap[x][y];
  47.        
  48.         String a = A.get(x);
  49.         String b = A.get(y);
  50.        
  51.         if( (a.length() <= b.length()) && b.startsWith(a)) {
  52.             overlap[x][y] = 0;
  53.             return 0;
  54.         }
  55.         else if(a.endsWith(b)) {
  56.             overlap[x][y] = a.length()-b.length();
  57.             return overlap[x][y];
  58.         }
  59.        
  60.         int len = a.length();
  61.         for(int i=1; i<=b.length(); i++){
  62.             if(i>a.length()) break;
  63.             if(a.endsWith(b.substring(0,i))){
  64.                 len = a.length()-i;
  65.             }
  66.         }
  67.        
  68.         overlap[x][y] = len;
  69.         return len;
  70.     }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement