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.