Advertisement
Guest User

Untitled

a guest
Dec 11th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.32 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class EditDistance implements EditDistanceInterface {
  4.      
  5.     int c_i, c_d, c_r;
  6.     static int MAX = Integer.MAX_VALUE;
  7.     static int UNDEF = -1;
  8.  
  9.     public EditDistance (int c_i, int c_d, int c_r) {
  10.         this.c_i = c_i;
  11.         this.c_d = c_d;
  12.         this.c_r = c_r;
  13.     }
  14.        
  15.     public int[][] getEditDistanceDP(String s1, String s2) {
  16.        
  17.         int m = s1.length();
  18.         int n = s2.length();
  19.        
  20.         int[][] dist = new int[m+1][n+1];
  21.        
  22.         for(int i = 0 ; i <= m; i++ )
  23.             dist[i][0] = i*c_d;
  24.        
  25.         for(int i = 0 ; i <= n; i++ )
  26.             dist[0][i] = i*c_i;
  27.        
  28.         for(int i = 1; i <= m; i++)
  29.             for(int j = 1; j <= n ; j++) {
  30.                 int temp = dist[i-1][j-1];
  31.                 temp += (s1.charAt(i-1) == s2.charAt(j-1))?0:c_r;
  32.                 dist[i][j] = Math.min(Math.min(temp,dist[i-1][j]+c_d),dist[i][j-1] + c_i);
  33.             }
  34.        
  35.         return dist ;
  36.     }
  37.    
  38.    
  39.  
  40.     public List<String> getMinimalEditSequence(String s1, String s2) {
  41.        
  42.         int m = s1.length();
  43.         int n = s2.length();
  44.        
  45.    
  46.         int[][] dist = new int[2][n+1];
  47.        
  48.         int x=1;
  49.         char[][] ops;
  50.         int[][] dec;
  51.    
  52.         do{
  53.            
  54.             x*=2;
  55.            
  56.             int diff = Math.abs(n-m)+x;
  57.             ops = new char[m+1][Math.min(n+1,2*diff+1)];
  58.             dec = new int[m+1][2];
  59.            
  60.             for(int i = 0 ; i < m+1; i++) {
  61.                 dec[i][0] = Math.max(0,i-diff);
  62.                 dec[i][1] = Math.min(n,i+diff);
  63.             }
  64.            
  65.             for(int j = dec[0][0] ; j <= dec[0][1]; j++ ) {
  66.                 dist[0][j] = j*c_i;
  67.                 ops[0][j] = 'i';
  68.             }
  69.            
  70.             for(int i = 1; i <= m; i++) {
  71.                 dist[i%2][0] = dist[(i+1)%2][0] + c_d;
  72.                 ops[i%2][0] = 'd';
  73.    
  74.                 for(int j = dec[i][0]+1; j<= dec[i][1] ; j++) {
  75.                     //System.out.println(i + " " + j);
  76.                     int temp = dist[(i+1)%2][j-1];
  77.                     char s = 'R';
  78.                    
  79.                     if(s1.charAt(i-1) != s2.charAt(j-1)) {
  80.                         temp+=c_r;
  81.                         s='r';
  82.                     }
  83.                    
  84.                     if(j-i+1 <= diff && dist[(i+1)%2][j] + c_d < temp && dist[(i+1)%2][j] + c_d < dist[i%2][j-1] + c_i) {
  85.                         dist[i%2][j] = dist[(i+1)%2][j] + c_d;
  86.                         s='d';     
  87.                     }
  88.                     else if(i-j+1 <=diff && dist[i%2][j-1] + c_i < temp && dist[i%2][j-1] + c_i <= dist[(i+1)%2][j] + c_d){
  89.                         dist[i%2][j] = dist[i%2][j-1] + c_i;
  90.                         s = 'i';
  91.                     }
  92.                     else {
  93.                         dist[i%2][j] = temp;
  94.                     }
  95.                    
  96.                     ops[i][j - dec[i][0]] = s;
  97.                 }
  98.             }
  99.        
  100.         }while(dist[m%2][n]/(c_i + c_d) > x);
  101.         //System.out.println(dist[m%2][n]);
  102.         LinkedList<String> ls = new LinkedList<> ();
  103.         int i = s1.length();
  104.         int j = s2.length();
  105.        
  106.         while(i !=0 || (j-dec[i][0])>0) {
  107.             //System.out.println(i + " " + j);
  108.             //System.out.println(ops.get(i,j));
  109.             switch(ops[i][j-dec[i][0]]) {
  110.                 case 'i':
  111.                     ls.add("insert(" + (i) + "," + s2.charAt(j-1) + ")");
  112.                     j--;
  113.                     break;
  114.                 case 'd':
  115.                     ls.add("delete(" + (i-1) +")");
  116.                     i--;
  117.                     break;
  118.                 case 'r':
  119.                     ls.add("replace(" + (i-1) + "," + s2.charAt(j-1) + ")");
  120.                     i--;
  121.                     j--;
  122.                     break;
  123.                 default:
  124.                     i--;
  125.                     j--;
  126.             }
  127.         }
  128.         return ls;
  129.        }
  130. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement