I am not sure why this is not passing. I have passed it every combination of tests I can think of, including null values evaluating false.
package com.codegym.task.task39.task3909;
/*
One change
*/
import java.util.Locale;
public class Solution
{
public static void main(String[] args)
{
//true cases
System.out.println(isOneEditAway("abcde","abcd"));
System.out.println(isOneEditAway("abcd","abcde"));
System.out.println(isOneEditAway("abcde","bcde"));
System.out.println(isOneEditAway("bcde","abcde"));
System.out.println(isOneEditAway("abcde","abctde"));
System.out.println(isOneEditAway("abctde","abcde"));
System.out.println(isOneEditAway("abcde","abtde"));
System.out.println(isOneEditAway("abtde","abcde"));
System.out.println(isOneEditAway("",""));
System.out.println(isOneEditAway("","a"));
System.out.println(isOneEditAway("a",""));
//false cases
System.out.println(isOneEditAway("abcde","abc"));
System.out.println(isOneEditAway("abc","abcde"));
System.out.println(isOneEditAway("abcde","abtte"));
System.out.println(isOneEditAway(null, null));
System.out.println(isOneEditAway("abcde", null));
System.out.println(isOneEditAway(null, "abcde"));
}
public static boolean isOneEditAway(String first, String second)
{
if(first == null || second == null)
{
return false;
}
first = first.toLowerCase(Locale.ROOT);
second = second.toLowerCase(Locale.ROOT);
String longer = (first.length() >= second.length() ? first : second);
String shorter = (first.length() < second.length() ? first : second);
if(longer.equals(shorter))
{
//already the same
return true;
}
if(longer.length() - shorter.length() > 1)
{
//impossible
return false;
}
if(longer.length() - shorter.length() == 1)
{
//test for deletion/addition
for(int i = 0; i < longer.length(); i++)
{
if(removeCharAt(longer, i).equals(shorter))
{
return true;
}
}
}
int numDiffs = 0;
//test for replacement
for(int i = 0; i < first.length(); i++)
{
if(first.charAt(i) != second.charAt(i))
{
numDiffs++;
}
if(numDiffs > 1)
{
return false;
}
}
return true;
}
public static String removeCharAt(String s, int pos)
{
return s.substring(0,pos)+s.substring(pos+1);
}
}