Проверить, можно ли сравнять две строки одной заменой или добавлением символа

80. Проверить, можно ли сравнять две строки одной заменой или добавлением символа

Условие задачи:
📌 В метод передаются две строки. Нужно вернуть true, если строки можно сделать одинаковыми, выполнив не более одного изменения:

  • заменить один символ

  • добавить один символ в одну из строк

Если для этого нужно больше одного изменения, метод должен вернуть false.

Код:

public boolean isOneEditAway(String s1, String s2) {
    // TODO
}

📌 Пример 1:
Вход:
s1 = "cat"
s2 = "cut"

Выход:
true

📌 Пример 2:
Вход:
s1 = "cat"
s2 = "cats"

Выход:
true

📌 Пример 3:
Вход:
s1 = "cat"
s2 = "dog"

Выход:
false


Спойлеры к решению

Подсказки
💡 Если разница длин строк больше 1, сразу можно вернуть false.
💡 Если длины равны, нужно проверить, отличаются ли строки не более чем в одной позиции.
💡 Если длины отличаются на 1, можно пройти двумя указателями и допустить один сдвиг.
💡 Удобно сначала определить, какая строка короче, а какая длиннее.

Решение
public boolean isOneEditAway(String s1, String s2) {
    if (s1 == null || s2 == null) {
        return false;
    }

    int len1 = s1.length();
    int len2 = s2.length();

    if (Math.abs(len1 - len2) > 1) {
        return false;
    }

    if (len1 == len2) {
        int diffCount = 0;
        for (int i = 0; i < len1; i++) {
            if (s1.charAt(i) != s2.charAt(i)) {
                diffCount++;
                if (diffCount > 1) {
                    return false;
                }
            }
        }
        return true;
    }

    String shorter = len1 < len2 ? s1 : s2;
    String longer = len1 < len2 ? s2 : s1;

    int i = 0;
    int j = 0;
    int diffCount = 0;

    while (i < shorter.length() && j < longer.length()) {
        if (shorter.charAt(i) == longer.charAt(j)) {
            i++;
            j++;
        } else {
            diffCount++;
            if (diffCount > 1) {
                return false;
            }
            j++;
        }
    }

    return true;
}

Если длины равны, проверяем не более одной замены. Если длины отличаются на 1, проверяем, можно ли пропустить один символ в более длинной строке. Если разница длин больше 1, ответ сразу false.