class EditOperation {
private int index;
private String originalChar;
private String newChar;
private String operation;
public EditOperation(int index, String originalChar, String newChar, String operation) {
this.index = index;
this.originalChar = originalChar;
this.newChar = newChar;
this.operation = operation;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getOriginalChar() {
return originalChar;
}
public void setOriginalChar(String originalChar) {
this.originalChar = originalChar;
}
public String getNewChar() {
return newChar;
}
public void setNewChar(String newChar) {
this.newChar = newChar;
}
public String getOperation() {
return operation;
}
public void setOperation(String operation) {
this.operation = operation;
}
}
private List<EditOperation> levenshtein(String str1, String str2) {
int[][] dp = new int[str1.length() + 1][str2.length() + 1];
List<EditOperation> operations = new ArrayList<>();
for (int i = 0; i <= str1.length(); i++) {
dp[i][0] = i;
}
for (int j = 0; j <= str2.length(); j++) {
dp[0][j] = j;
}
for (int i = 1; i <= str1.length(); i++) {
for (int j = 1; j <= str2.length(); j++) {
int cost = str1.charAt(i - 1) == str2.charAt(j - 1) ? 0 : 1;
dp[i][j] = Math.min(
Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + cost);
}
}
int i = str1.length();
int j = str2.length();
while (i > 0 && j > 0) {
int cost = str1.charAt(i - 1) == str2.charAt(j - 1) ? 0 : 1;
if (dp[i][j] == dp[i - 1][j] + 1) {
operations.add(new EditOperation(i - 1, str1.substring(i - 1, i),
"DELETE", "DELETE"));
i--;
} else if (dp[i][j] == dp[i][j - 1] + 1) {
operations.add(new EditOperation(i - 1, "INSERT",
str2.substring(j - 1, j), "INSERT"));
j--;
} else if (dp[i][j] == dp[i - 1][j - 1] + cost) {
if (cost == 1) {
operations.add(new EditOperation(i - 1, str1.substring(i - 1, i),
str2.substring(j - 1, j), "SUBSTITUTE"));
}
i--;
j--;
}
}
while (i > 0) {
operations.add(new EditOperation(i - 1, str1.substring(i - 1, i),
"DELETE", "DELETE"));
i--;
}
while (j > 0) {
operations.add(new EditOperation(str1.length() - 1, "INSERT",
str2.substring(j - 1, j), "INSERT"));
j--;
}
Collections.reverse(operations);
return operations;
}