package com.freetymekiyan.algorithms.level.medium; /** * Given two strings S and T, determine if they are both one edit distance apart. * <p> * Company Tags: Snapchat, Uber, Facebook, Twitter * Tags: String * Similar Problems: (H) Edit Distance */ public class OneEditDistance { /** * Edit distance: add, remove, or replace. * Three possible situations: * 1) s and t are of same length, replace * 2) delete 1 char from s * 3) delete 1 char from t * <p> * Implementation: * Get the lengths of two strings, m and n. * Compare m and n. Always put the shorter string as the first parameter. * If the difference of their lengths are larger than 1, return false. * Loop through the shorter string to find a different char. * If found and they are of same length, the rest of them should be the same. * If found and they are of different length, the rest of shorter string, including that char, * should be the same as the rest of longer string, excluding that char. * If all chars are the same, it can only be the last character in longer string. * Return true iff longer string is one character longer. */ public boolean isOneEditDistance(String s, String t) { int m = s.length(); int n = t.length(); if (m > n) { return isOneEditDistance(t, s); // This way, n >= m always } if (n - m > 1) return false; for (int i = 0; i < m; i++) { if (s.charAt(i) == t.charAt(i)) { continue; } if (m == n) { return s.substring(i + 1).equals(t.substring(i + 1)); } if (m < n) { return s.substring(i).equals(t.substring(i + 1)); } } return m != n; // If all characters are the same, will pass previous checks. } }