From 846534bfb60d13a21493a1d90c6d65f8c541d49d Mon Sep 17 00:00:00 2001 From: Le Phong Lam Date: Sat, 29 Jul 2023 19:54:07 +0700 Subject: [PATCH] create OneAwayTest.java to test methods and create OneAwayFix.java to fix isOneEditAway method --- src/.classpath | 15 ++++ src/.gitignore | 1 + src/.project | 17 +++++ .../com/ctci/arraysandstrings/OneAway.java | 6 +- .../com/ctci/arraysandstrings/OneAwayFix.java | 71 +++++++++++++++++++ .../ctci/arraysandstrings/OneAwayTest.java | 50 +++++++++++++ 6 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 src/.classpath create mode 100644 src/.gitignore create mode 100644 src/.project create mode 100644 src/main/java/com/ctci/arraysandstrings/OneAwayFix.java create mode 100644 src/main/java/com/ctci/arraysandstrings/OneAwayTest.java diff --git a/src/.classpath b/src/.classpath new file mode 100644 index 00000000..18c1c68b --- /dev/null +++ b/src/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 00000000..ae3c1726 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/src/.project b/src/.project new file mode 100644 index 00000000..0f6f6a76 --- /dev/null +++ b/src/.project @@ -0,0 +1,17 @@ + + + src + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/src/main/java/com/ctci/arraysandstrings/OneAway.java b/src/main/java/com/ctci/arraysandstrings/OneAway.java index f5345ed7..37530447 100644 --- a/src/main/java/com/ctci/arraysandstrings/OneAway.java +++ b/src/main/java/com/ctci/arraysandstrings/OneAway.java @@ -14,7 +14,7 @@ public class OneAway { * @param s2 * @return */ - private static boolean isOneEditAway(String s1, String s2) { + public static boolean isOneEditAway(String s1, String s2) { if (s1.length() == s2.length()) { return isOneCharacterDiffAtMax(s1, s2); } else if (s1.length() < s2.length()) { @@ -24,7 +24,7 @@ private static boolean isOneEditAway(String s1, String s2) { } } - private static boolean isOneCharacterDiffAtMax(String s1, String s2) { + public static boolean isOneCharacterDiffAtMax(String s1, String s2) { boolean foundDiff = false; for (int i = 0; i < s1.length(); i++) { if (s1.charAt(i) != s2.charAt(i)) { @@ -37,7 +37,7 @@ private static boolean isOneCharacterDiffAtMax(String s1, String s2) { return true; } - private static boolean checkForMaxOneInsertOrDeleteInS1(String s1, String s2) { + public static boolean checkForMaxOneInsertOrDeleteInS1(String s1, String s2) { int i = 0; int j = 0; int s1Len = s1.length(); diff --git a/src/main/java/com/ctci/arraysandstrings/OneAwayFix.java b/src/main/java/com/ctci/arraysandstrings/OneAwayFix.java new file mode 100644 index 00000000..b1de7353 --- /dev/null +++ b/src/main/java/com/ctci/arraysandstrings/OneAwayFix.java @@ -0,0 +1,71 @@ +package com.ctci.arraysandstrings; + +/** + * @author rampatra + * @since 24/11/2018 + */ +public class OneAwayFix { + + /** + * Checks if two strings are only one edit away, that is, by inserting, deleting, or editing + * at max one character in {@code s1} it becomes same as {@code s2}. + * + * @param s1 + * @param s2 + * @return + */ + public static boolean isOneEditAway(String s1, String s2) { + if(s1 == null || s2 == null) { + throw new NullPointerException("s1 or s2 parameter is null"); + } + if (s1.length() == s2.length()) { + return isOneCharacterDiffAtMax(s1, s2); + } else { + return checkForMaxOneInsertOrDeleteInS1(s1, s2); + } + } + + public static boolean isOneCharacterDiffAtMax(String s1, String s2) { + boolean foundDiff = false; + for (int i = 0; i < s1.length(); i++) { + if (s1.charAt(i) != s2.charAt(i)) { + if (foundDiff) { + return false; // means we already found a difference earlier + } + foundDiff = true; + } + } + return true; + } + + public static boolean checkForMaxOneInsertOrDeleteInS1(String s1, String s2) { + int i = 0; + int j = 0; + int s1Len = s1.length(); + int s2Len = s2.length(); + if (Math.abs(s1Len - s2Len) > 1) return false; + + while (i < s1Len && j < s2Len) { + if (s1.charAt(i) != s2.charAt(j)) { + if (s1Len > s2Len) { + i++; + } else { + j++; + } + continue; + } + i++; + j++; + } + return Math.abs(i - j) <= 1; // check whether difference in two strings is not more than 1 + } + + public static void main(String[] args) { + System.out.println("pale, ple: " + isOneEditAway("pale", "ple")); + System.out.println("pales,pale: " + isOneEditAway("pales", "pale")); + System.out.println("pale, bale: " + isOneEditAway("pale", "bale")); + System.out.println("pale, bake: " + isOneEditAway("pale", "bake")); + System.out.println("ram, rama: " + isOneEditAway("ram", "rama")); + System.out.println("ram, ramaaaaaaa: " + isOneEditAway("ram", "ramaaaaaaa")); + } +} diff --git a/src/main/java/com/ctci/arraysandstrings/OneAwayTest.java b/src/main/java/com/ctci/arraysandstrings/OneAwayTest.java new file mode 100644 index 00000000..064aca43 --- /dev/null +++ b/src/main/java/com/ctci/arraysandstrings/OneAwayTest.java @@ -0,0 +1,50 @@ +package com.ctci.arraysandstrings; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + + + +class OneAwayTest { + + @Test + static void testIsOneCharacterDiffAtMax() { + assertTrue(OneAway.isOneCharacterDiffAtMax("", "")); + assertTrue(OneAway.isOneCharacterDiffAtMax("abcdef", "abcdef")); + assertTrue(OneAway.isOneCharacterDiffAtMax("abc", "abd")); + + assertFalse(OneAway.isOneCharacterDiffAtMax("abcdef", "abcfed")); + assertFalse(OneAway.isOneCharacterDiffAtMax("abcabc", "abcdef")); + } + + @Test + static void testCheckForMaxOneInsertOrDeleteInS1() { + assertFalse(OneAway.checkForMaxOneInsertOrDeleteInS1("mn", "mnpq")); + assertFalse(OneAway.checkForMaxOneInsertOrDeleteInS1("abcd", "e")); + + assertTrue(OneAway.checkForMaxOneInsertOrDeleteInS1("", "p")); + assertTrue(OneAway.checkForMaxOneInsertOrDeleteInS1("e", "")); + + assertTrue(OneAway.checkForMaxOneInsertOrDeleteInS1("bubble", "buble")); + assertTrue(OneAway.checkForMaxOneInsertOrDeleteInS1("apple", "apples")); + + assertFalse(OneAway.isOneEditAway("abcdef", "abcfeda")); + } + + @Test + static void testIsOneEditAway() { + assertTrue(OneAway.isOneEditAway("", "")); + assertTrue(OneAway.isOneEditAway("abc", "abc")); + assertTrue(OneAway.isOneEditAway("pale", "bale")); + assertFalse(OneAway.isOneEditAway("pale", "bake")); + + assertTrue(OneAway.isOneEditAway("pale", "pales")); + assertFalse(OneAway.isOneEditAway("ram", "ramaaaaaaa")); + + assertTrue(OneAway.isOneEditAway("pale", "ple")); + assertFalse(OneAway.isOneEditAway("ramaaaaaaa", "ram")); + + } +}