Проверьте, являются ли два массива циклическими перестановками
учитывая два массива, как вы проверяете, является ли один циклической перестановкой другого?
например,a = [1, 2, 3, 1, 5]
, b = [3, 1, 5, 1, 2]
и c = [2, 1, 3, 1, 5]
у нас есть это a
и b
- циклические перестановки, но c
не циклическую перестановку либо.
Примечание: массивы могут иметь повторяющиеся элементы.
4 ответов
стандартный трюк здесь состоит в том, чтобы объединить один из массивов с самим собой, а затем попытаться найти 2-й массив в объединенном массиве.
например,' a', объединенный с самим собой:
[1, 2, 3, 1, 5, 1, 2, 3, 1, 5]
поскольку вы видите " b " в этом массиве, начиная с 3-го элемента, то a и b являются циклическими перестановками.
Если A и B-циклические перестановки друг друга, A будет найден в удвоенном списке BB (как и B в AA).
эффективный способ обработки больших объемов данных-преобразовать каждый из них в "каноническую" форму, а затем сравнить, чтобы увидеть, что они равны. Для этой задачи вы можете выбрать в качестве канонической формы всех повернутых перестановок ту, которая "сортирует наименьшее".
таким образом, каноническая форма для " a " и " b " является [1, 2, 3, 1, 5] которые равны, поэтому они являются ациклическими перестановками.
каноническая форма для 'c' является [1, 3, 1, 5, 2] а это совсем другое.
вот простой подход adhoc к обнаружению циклических перестановок с O (n) временной сложностью.
a = [1, 2, 3, 1, 5], b = [3, 1, 5, 1, 2]
найти индекс b[0] в A [], скажем, индекс "x".Тогда начать навигация в обоих массивах. a [] начинается с индекса 'x' и b[] начинается с '0'. Так что оба они должны иметь одинаковые ценности. Если нет, они не сквозные. Вот пример кода.
public class CyclicPermutation {
static char[] arr = { 'A', 'B', 'C', 'D' };
static char[] brr = { 'C', 'D', 'K', 'B' };
boolean dec = false;
public static void main(String[] args) {
boolean avail = true;
int val = getFirstElementIndex(brr[0]);
if(val ==Integer.MIN_VALUE){
avail = false;
return;
}
for (int i = val, j = 0; j <= brr.length-1; ) {
if (i > arr.length-1) {
i = 0;
}
if (arr[i] == brr[j]) {
i++;
j++;
} else {
avail = false;
System.out.println(avail);
return;
}
}
System.out.println(avail);
}
public static int getFirstElementIndex(char c) {
for (int i = 0; i <= arr.length; i++) {
if (arr[i] == c) {
return i;
}
}
return Integer.MIN_VALUE;
}
}