Одно изменение
Реализуй метод isOneEditAway(String first, String second) который будет возвращать true, если возможно изменить/добавить/удалить один символ в одной из строк и получить другую.
Символы в анализируемой строке ограничены кодировкой ASCII.
Регистр символов учитывается.
Требования:
1. Метод isOneEditAway должен корректно работать для строк одинаковой длины.
2. Метод isOneEditAway должен корректно работать для строк разной длины.
3. Метод isOneEditAway должен корректно работать для пустых строк.
4. Метод isOneEditAway должен быть публичным.
У меня не принимает первые два пункта.
Код:
package com.javarush.task.task39.task3909;
/*
Одно изменение
*/
public class Solution {
public static void main(String[] args) {
System.out.println(isOneEditAway("", "")); // true
System.out.println(isOneEditAway("", "m")); //true
System.out.println(isOneEditAway("m", "")); //true
//System.out.println(isOneEditAway("m", null)); //
System.out.println("------");
System.out.println(isOneEditAway("mama", "ramas")); //false
System.out.println(isOneEditAway("mamas", "rama")); //false
System.out.println(isOneEditAway("rama", "mama")); //true
System.out.println(isOneEditAway("mama", "dama")); //true
System.out.println(isOneEditAway("ama", "mama")); //true
System.out.println(isOneEditAway("mama", "ama")); //true
}
public static boolean isOneEditAway(String first, String second) {
/*if (first == null || second == null)
return false;*/
// По комментам это условие просто необходимо
if (first.equals(second))
return true;
//заполняем два массива количеством символов из обоих строк согласно кодов ASCII
int len = 255;
int[] countOfCharsFirst = new int[len];
char[] chars = first.toCharArray();
for (int i = 0, n = chars.length; i < n; i++) {
countOfCharsFirst[(int)chars[i]] ++;
}
int[] countOfCharsSecond = new int[len];
chars = second.toCharArray();
for (int i = 0, n = chars.length; i < n; i++) {
countOfCharsSecond[(int)chars[i]] ++;
}
//вводим две переменные разницы кол-ва символов, две чтобы учитывать случай со сменой символа
int countOfDiff1 = 0;
int countOfDiff2 = 0;
for (int i = 0; i < len; i++) {
//если кол-во какого символа в первой строке больше на 1 чем во второй, то инкрементируем разницу1
if (countOfCharsFirst[i] - countOfCharsSecond[i] == 1) {
countOfDiff1++;
}
//если кол-во какого символа в первой строке меньше на 1 чем во второй, то инкрементируем разницу2
if (countOfCharsFirst[i] - countOfCharsSecond[i] == -1) {
countOfDiff2++;
}
//если разница в количестве больше 1, то сразу false
if (Math.abs(countOfCharsFirst[i] - countOfCharsSecond[i]) > 1)
return false;
//если количество одной из разниц больше 1, то сразу false
if (countOfDiff1 > 1 || countOfDiff2 > 1)
return false;
}
//если любая разница в количестве равна 1 или обе сразу, то true
if (countOfDiff1 == 1 || countOfDiff2 == 1)
return true;
//остаточный false
return false;
}
}
package com.javarush.task.task39.task3909;
/*
Одно изменение
*/
public class Solution {
public static void main(String[] args) {
System.out.println(isOneEditAway("", "")); // true
System.out.println(isOneEditAway("", "m")); //true
System.out.println(isOneEditAway("m", "")); //true
//System.out.println(isOneEditAway("m", null)); //
System.out.println("------");
System.out.println(isOneEditAway("mama", "ramas")); //false
System.out.println(isOneEditAway("mamas", "rama")); //false
System.out.println(isOneEditAway("rama", "mama")); //true
System.out.println(isOneEditAway("mama", "dama")); //true
System.out.println(isOneEditAway("ama", "mama")); //true
System.out.println(isOneEditAway("mama", "ama")); //true
}
public static boolean isOneEditAway(String first, String second) {
/*if (first == null || second == null)
return false;*/
if (first.equals(second))
return true;
int len = 255;
int[] countOfCharsFirst = new int[len];
char[] chars = first.toCharArray();
for (int i = 0, n = chars.length; i < n; i++) {
/*if (chars[i] >= 'A' && chars[i] <= 'Z')
chars[i] = (char) (chars[i] + 32);*/
countOfCharsFirst[(int)chars[i]] ++;
}
int[] countOfCharsSecond = new int[len];
chars = second.toCharArray();
for (int i = 0, n = chars.length; i < n; i++) {
/*if (chars[i] >= 'A' && chars[i] <= 'Z')
chars[i] = (char) (chars[i] + 32);*/
countOfCharsSecond[(int)chars[i]] ++;
}
int countOfDiff1 = 0;
int countOfDiff2 = 0;
for (int i = 0; i < len; i++) {
if (countOfCharsFirst[i] - countOfCharsSecond[i] == 1) {
countOfDiff1++;
}
if (countOfCharsFirst[i] - countOfCharsSecond[i] == -1) {
countOfDiff2++;
}
if (Math.abs(countOfCharsFirst[i] - countOfCharsSecond[i]) > 1)
return false;
if (countOfDiff1 > 1 || countOfDiff2 > 1)
return false;
}
if (countOfDiff1 == 1 || countOfDiff2 == 1)
return true;
return false;
}
}