Ответ приходит неправильно для некоторых тестовых случаев - PullRequest
0 голосов
/ 28 марта 2020

Учитывая две строки A и B строчных букв, верните true тогда и только тогда, когда мы можем поменять местами две буквы в A, чтобы результат был равен B. Для приведенного ниже теста ниже ответ идет неправильно.

Input:
"aaaaaaabc"
"aaaaaaacb"
class Solution {
    public boolean buddyStrings(String A, String B)
    {
        int count=0,index=0;
        int a[] = new int[A.length()];
        if( A.length()!=B.length() )
            return false;
        if( A.equals(B) )
        {
            for(int i=0; i<A.length() ;i++)
            {
                if( A.charAt(0)==A.charAt(i) )
                    count++;
            }
            return( count==A.length() );
        }

        for(int i=0; i<A.length(); i++)
        {
            if(A.charAt(i) ! = B.charAt(i))
                a[index++] = i;
        }
         if( a.length==2 )
        {
            if(A.charAt(a[0])==B.charAt(a[1]) && A.charAt(a[1])==B.charAt(a[0]))
                return true;
            else
                return false;
        } 
        else
        return false;
    }
}

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Ты рядом. Ниже мое решение проблемы, а именно: верните true, если и только если мы можем поменять две буквы в A так, чтобы результат равнялся B Пояснения после кода.

public boolean buddyStrings(String s1, String s2) {
    boolean result = false;
    if (s1 != null  &&  s2 != null) {
        char[] letters1 = s1.toCharArray();
        char[] letters2 = s2.toCharArray();
        if (letters1.length == letters2.length  &&  letters1.length > 1) {
            int[] indices = new int[2];
            int index = 0;
            for (int i = 0; i < letters1.length; i++) {
                if (letters1[i] != letters2[i]) {
                    if (index < 2) {
                        indices[index++] = i;
                    }
                    else {
                        index++;
                        break;
                    }
                }
            }
            if (index == 2) {
                result = letters1[indices[0]] == letters2[indices[1]];
            }
        }
    }
    return result;
}

Во-первых Как и в вашем коде, длина обеих строк должна быть одинаковой, а длина должна быть больше 1 (одной), поскольку нельзя заменить две буквы в строке, если строка содержит только одну букву.

Теперь мы проверяем соответствующие буквы в каждой строке и сохраняем индексы соответствующих букв, которые отличаются. Например, для ваших тестовых строк индексы будут 7 и 8. Таких индексов должно быть ровно два. Поэтому я сохраняю индексы в массиве int размером 2.

После проверки всех букв должно быть ровно две разные буквы. Осталось только проверить, что если мы поменяем две буквы, две строки будут идентичны.

0 голосов
/ 28 марта 2020

Эта часть вашего кода является проблемой.

if( A.equals(B) )
        {
            for(int i=0; i<A.length() ;i++)
            {
                if( A.charAt(0)==A.charAt(i) )
                    count++;
            }
            return( count==A.length() );
        }

Рассмотрим случай, когда A = B = "abcdefga".

Согласно вашему коду, i принимает значения от 0 до 7. Условие выполняется только один раз, т.е. когда i = 7, поэтому счет равен 1, когда l oop завершен. В вашем return утверждении count == A.length() возвращает false, потому что 1 = / = 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...