From 3655eaab865446a5fbc4d4f134cb1f66206918e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Dobrovoljc?= Date: Sun, 25 May 2025 20:02:46 +0200 Subject: [PATCH] Naloga 5 --- naloga5/.gitignore | 29 ++++++++++ naloga5/.idea/.gitignore | 10 ++++ .../inspectionProfiles/Project_Default.xml | 19 ++++++ naloga5/.idea/misc.xml | 6 ++ naloga5/.idea/modules.xml | 8 +++ naloga5/naloga5.iml | 11 ++++ naloga5/src/Naloga5.java | 58 +++++++++++++++++++ 7 files changed, 141 insertions(+) create mode 100644 naloga5/.gitignore create mode 100644 naloga5/.idea/.gitignore create mode 100644 naloga5/.idea/inspectionProfiles/Project_Default.xml create mode 100644 naloga5/.idea/misc.xml create mode 100644 naloga5/.idea/modules.xml create mode 100644 naloga5/naloga5.iml create mode 100644 naloga5/src/Naloga5.java diff --git a/naloga5/.gitignore b/naloga5/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/naloga5/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/naloga5/.idea/.gitignore b/naloga5/.idea/.gitignore new file mode 100644 index 0000000..7bc07ec --- /dev/null +++ b/naloga5/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Environment-dependent path to Maven home directory +/mavenHomeManager.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/naloga5/.idea/inspectionProfiles/Project_Default.xml b/naloga5/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..5b739d1 --- /dev/null +++ b/naloga5/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/naloga5/.idea/misc.xml b/naloga5/.idea/misc.xml new file mode 100644 index 0000000..49c5998 --- /dev/null +++ b/naloga5/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/naloga5/.idea/modules.xml b/naloga5/.idea/modules.xml new file mode 100644 index 0000000..35f2a92 --- /dev/null +++ b/naloga5/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/naloga5/naloga5.iml b/naloga5/naloga5.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/naloga5/naloga5.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/naloga5/src/Naloga5.java b/naloga5/src/Naloga5.java new file mode 100644 index 0000000..d6168d7 --- /dev/null +++ b/naloga5/src/Naloga5.java @@ -0,0 +1,58 @@ +import java.util.ArrayList; + +public class Naloga5 { + static String[][] getEditDistanceAlignments(String s1, String s2) { + int m = s1.length(); + int n = s2.length(); + int[][] dp = new int[m + 1][n + 1]; + + + for (int i = 0; i <= m; i++) dp[i][0] = i; + for (int j = 0; j <= n; j++) dp[0][j] = j; + + + for (int i = 1; i <= m; i++) { + for (int j = 1; j <= n; j++) { + if (s1.charAt(i - 1) == s2.charAt(j - 1)) { + dp[i][j] = dp[i - 1][j - 1]; + } else { + dp[i][j] = 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])); + } + } + } + + ArrayList result = new ArrayList<>(); + backtrack(s1, s2, m, n, "", "", dp, result); + + String[][] alignments = new String[result.size()][2]; + for (int i = 0; i < result.size(); i++) { + alignments[i][0] = result.get(i)[0]; + alignments[i][1] = result.get(i)[1]; + } + return alignments; + } + + static void backtrack(String s1, String s2, int i, int j, String aligned1, String aligned2, int[][] dp, ArrayList result) { + if (i == 0 && j == 0) { + result.add(new String[]{new StringBuilder(aligned1).reverse().toString(), new StringBuilder(aligned2).reverse().toString()}); + return; + } + + if (i > 0 && j > 0 && s1.charAt(i - 1) == s2.charAt(j - 1) && dp[i][j] == dp[i - 1][j - 1]) { + backtrack(s1, s2, i - 1, j - 1, aligned1 + s1.charAt(i - 1), aligned2 + s2.charAt(j - 1), dp, result); + } + + if (i > 0 && j > 0 && dp[i][j] == dp[i - 1][j - 1] + 1) { + backtrack(s1, s2, i - 1, j - 1, aligned1 + s1.charAt(i - 1), aligned2 + s2.charAt(j - 1), dp, result); + } + + if (i > 0 && dp[i][j] == dp[i - 1][j] + 1) { + backtrack(s1, s2, i - 1, j, aligned1 + s1.charAt(i - 1), aligned2 + '-', dp, result); + } + + if (j > 0 && dp[i][j] == dp[i][j - 1] + 1) { + backtrack(s1, s2, i, j - 1, aligned1 + '-', aligned2 + s2.charAt(j - 1), dp, result); + } + } +} +