Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class Solution {
- public int solve(ArrayList<String> A) {
- int n = A.size();
- if(n == 1) return A.get(0).length();
- int [][] overlap = new int [n+1][n+1];
- int [][] dp = new int [n+1][(1<<A.size())];
- for(int i=0; i<=n; i++) Arrays.fill(overlap[i], -1);
- for(int i=0; i<=n; i++) Arrays.fill(dp[i], -1);
- int result = Integer.MAX_VALUE;
- for(int i=0; i<A.size(); i++){
- result = Math.min(result, solution(A, i, 0, dp, overlap));
- }
- return result;
- }
- private int solution(ArrayList<String> A, int i, int mask, int [][] dp, int [][] overlap){
- if(dp[i][mask]!= -1) return dp[i][mask];
- int lastmask = (1<<A.size())-1;
- if(mask == lastmask){
- dp[i][mask] = A.get(i).length();
- return dp[i][mask];
- }
- int result = Integer.MAX_VALUE;
- for(int j=0; j<A.size(); j++){
- if((mask&(1<<j)) == 0){
- int value = solution(A, j, (mask|(1<<i)), dp, overlap) +
- findNonOverLappingLength(A, i, j, overlap);
- result = Math.min(result, value);
- }
- }
- dp[i][mask] = result;
- return dp[i][mask];
- }
- private int findNonOverLappingLength(ArrayList<String> A, int x, int y, int [][] overlap){
- if(overlap[x][y] != -1) return overlap[x][y];
- String a = A.get(x);
- String b = A.get(y);
- if( (a.length() <= b.length()) && b.startsWith(a)) {
- overlap[x][y] = 0;
- return 0;
- }
- else if(a.endsWith(b)) {
- overlap[x][y] = a.length()-b.length();
- return overlap[x][y];
- }
- int len = a.length();
- for(int i=1; i<=b.length(); i++){
- if(i>a.length()) break;
- if(a.endsWith(b.substring(0,i))){
- len = a.length()-i;
- }
- }
- overlap[x][y] = len;
- return len;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement