Две строки в java - PullRequest
       1

Две строки в java

0 голосов
/ 04 апреля 2020

Вопрос:

Две строки, a и b, называются близнецами, только если их можно сделать эквивалентными, выполнив некоторое количество операций с одной или обеими строками. Возможны две операции:

SwapEven: поменять символ с четным индексом на символ с другим четным индексом.

SwapOdd: поменять символ с нечетным индексом на символ с другим нечетным индексом.

Например, a = "abcd" и b-cdab "являются близнецами, потому что мы можем сделать их эквивалентными, выполняя операции. Альтернативно, a-" abcd "и b =" bcda "не являются близнецами (операции делают не перемещать символы между нечетными и четными индексами), а также a = "ab c" и b- "ab" (никакое количество операций не вставит a в строку b).

Мое решение до сих пор :

public static List<String> twins(List<String> a, List<String> b) {
        ArrayList<String> result = new ArrayList<String>();
        for (int j=0;j<a.size();j++) {
            char temp;
            char[] tempa= a.get(j).toCharArray();
            char[] tempb= b.get(j).toCharArray();
            for(int i=0; i<(tempa.length/2); i++) {
                temp = tempa[i];
                tempa[i] = tempa[i+2];
                tempa[i+2] = temp;
            }
            String stra = new String(tempa);
            String strb = new String(tempb);
            if(stra.equals(strb))
                result.add("Yes");
            else
                result.add("No");
        }
        return result;
    }

Ошибки:

Я получаю исключение ArrayIndexOutOfBounds для секунды для l oop в некоторых случаях, тогда как иногда я получаю неправильный ответ.

EDIT:

public static List<String> twins(List<String> a, List<String> b) {
        ArrayList<String> result = new ArrayList<String>();
        int min = Math.min(a.size(),b.size());
        for (int i=0; i<min; i++) {
            char[] tempae= a.get(i).toCharArray();
            char[] tempbo= b.get(i).toCharArray();
            char[] tempao= a.get(i).toCharArray();
            char[] tempbe= b.get(i).toCharArray();
            for (int j=1, k=0; j<tempao.length; j+=2, k++) {
                tempao[k] = tempao[j];
                tempbo[k] = tempbo[j];
            }
            for (int l=0, m=0; l<tempao.length; l+=2, m++) {
                tempae[m] = tempae[l];
                tempbe[m] = tempbe[l];
            }
            Arrays.sort(tempae);
            Arrays.sort(tempbe);
            Arrays.sort(tempao);
            Arrays.sort(tempbo);
            String evenA = new String(tempae);
            String oddA = new String(tempao);
            String evenB = new String(tempbe);
            String oddB = new String(tempbo);
            if (evenA.equals(evenB) || oddB.equals(oddA))
                result.add("Yes");
            else
                result.add("No");
        }
        return result;
    }

Ошибки: я не получаю никаких исключений, но в большинстве тестов я не выполняю

Окончательное редактирование Я выяснил свои ошибки, я не удалял неизмененные элементы из символа []

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Ответ PM 77-1 достаточно хорошо объясняет проблемы с вашим текущим кодом, но не предоставляет алгоритм для удовлетворения требований. Для этого я бы преобразовал каждую строку в две карты - карту частот для нечетных индексов и карту частот для четных индексов, а затем сравнил их:

public static boolean areTwins(String s1, String s2) {
    return getEvenFrequncy(s1).equals(getEvenFrequncy(s2)) &&
           getOddFrequncy(s1).equals(getOddFrequncy(s1));
}

private static Map<Character, Long> getEvenFrequncy(String s) {
    return getFrequency(s, 0);
}

private static Map<Character, Long> getOddFrequncy(String s) {
    return getFrequency(s, 1);
}

private static Map<Character, Long> getFrequency(String s, int oddOrEven) {
    return IntStream.range(oddOrEven, (s.length() + 1) / 2)
                    .map(i -> i * 2 - oddOrEven)
                    .mapToObj(s::charAt)
                    .collect(Collectors.groupingBy(Function.identity(), 
                                                   Collectors.counting()));
}
0 голосов
/ 04 апреля 2020

Вы получите ошибку, если длина строки a равна нечетная .

Например, a = "123"

Длина равна 3 . length/2 is 1

Ваш l oop становится:

        for(int i=0; i<3; i++) {
            temp = tempa[i];
            tempa[i] = tempa[i+2];
            tempa[i+2] = temp;
        }

Когда i становится 2 i+2 будет для 4 . И у вас «ситуация вне пределов».

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

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