如何解决检查两个数组是否为循环排列
| 给定两个数组,如何检查一个数组是否为另一个的循环排列? 例如,给定a = [1,2,3,1,5]
,ѭ1and和c = [2,5]
,我们得出ѭ3have和b
是循环置换,而not5ѭ不是这两个的循环置换。
注意:数组可能具有重复的元素。
解决方法
这里的标准技巧是将一个数组与其自身连接起来,然后尝试在连接的数组中找到第二个数组。
例如,与自身串联的\'a \'是:
[1、2、3、1、5、1、2、3、1、5]
因为您确实从第3个元素开始在此数组中看到\'b \',所以a和b是循环排列。
,如果A和B是彼此的循环排列,则A将在双列列表BB中找到(就像A在A中一样)。
,处理大量数据的有效方法是将每个数据转换为“规范”形式,然后进行比较以查看它们是否相等。对于此问题,您可以选择“最小排序”作为所有旋转排列的规范形式。
因此,\'a \'和\'b \'的规范形式为[1、2、3、1、5],它们相等,因此它们是非循环排列。
\'c \'的规范形式为[1、3、1、5、2],这是不同的。
,这是一种简单的即席方法,可发现时间复杂度为O(n)的循环置换。
a = [1、2、3、1、5],b = [3、1、5、1、2]
在a []中找到b [0]的索引,假设索引为\'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;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。