Проверка возможности преобразования строки за одно редактирование

Сравнивайте строки двумя указателями и разрешите одно несовпадение. При разной длине пропускайте символ только в более длинной строке, при равной — в обеих.

Короткий ответ

Что ответить на собеседовании

Сравнивайте строки двумя указателями и разрешите одно несовпадение. При разной длине пропускайте символ только в более длинной строке, при равной — в обеих.

Подробный разбор

Ответ с пояснениями

Условие

Метод, который проверяет, можно ли получить одну строку из другой, совершив ровно одну из следующих операций:

  • замену одного символа
  • вставку одного символа
  • удаление одного символа

Примеры: "a" → "b" → true "ab" → "b" → true "ab" → "cb" → true "ab" → "ba" → false

public boolean editing(String s1, String s2) {
    // реализация
}

Ответ

Сравнивайте строки двумя указателями и разрешите одно несовпадение. При разной длине пропускайте символ только в более длинной строке, при равной — в обеих.

public boolean editing(String s1, String s2) {
    if (s1 == null || s2 == null) throw new IllegalArgumentException();
    if (Math.abs(s1.length() - s2.length()) > 1) return false;
    int i = 0, j = 0, edits = 0;
    while (i < s1.length() && j < s2.length()) {
        if (s1.charAt(i) == s2.charAt(j)) { i++; j++; }
        else {
            if (++edits > 1) return false;
            if (s1.length() >= s2.length()) i++;
            if (s2.length() >= s1.length()) j++;
        }
    }
    if (i < s1.length() || j < s2.length()) edits++;
    return edits == 1;
}

Равные строки дают false: требуется ровно одно изменение. Время O(n+m), память O(1). Символом считается UTF-16 char; для произвольных Unicode code points нужен другой способ обхода.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее