Если массивы не содержат дубликатов , один из способов сделать это в O(N)
- использовать Set
, представляющий каноническую форму строк в массиве. Как то так:
static Set<String> canonicalSet(String[] arr) {
Set<String> upperSet = new HashSet<String>();
for (String s : arr) {
upperSet.add(s.toUpperCase());
}
return upperSet;
}
static boolean equalsCanonically(String[] arr1, String[] arr2) {
return canonicalSet(arr1).equals(canonicalSet(arr2));
}
Это оптимальное время.
Вы также можете изменять эту технику, чтобы сэкономить больше места, например, вместо построения канонических наборов и их сравнения вы можете создать канонический набор для arr1
, а затем удалить записи из этого набора в соответствии с элементами arr2
. Если после этого набор пуст, и вы всегда можете найти то, что вам нужно удалить, эти два массива канонически равны.
static boolean equalsCanonically2(String[] arr1, String[] arr2) {
Set<String> canon = canonicalSet(arr1);
for (String s : arr2) {
if (!canon.remove(s.toUpperCase())) return false;
}
return canon.isEmpty();
}
Вы также можете выполнить простую проверку сравнения размеров, если считаете, что оно того стоит (т. Е. Если часто два массива даже не имеют одинаковое количество элементов).
Если в массивах есть дубликаты, метод Set
не будет работать как есть. Вам понадобится мультимножество, и вы можете либо реализовать свой собственный, либо использовать Google Collections '.
Есть также O(N log N)
способы сделать это, включая сортировку строк. Вы можете отсортировать оба массива, а затем выполнить простую линейную проверку. Необходимо использовать регистр без учета регистра, и фактически он уже существует как String.CASE_INSENSITIVE_ORDER
.
static boolean equalsCanonically3(String[] arr1, String[] arr2) {
int N = arr1.length;
if (arr2.length != N) return false;
Arrays.sort(arr1, String.CASE_INSENSITIVE_ORDER);
Arrays.sort(arr2, String.CASE_INSENSITIVE_ORDER);
for (int i = 0; i < N; i++) {
if (String.CASE_INSENSITIVE_ORDER.compare(arr1[i], arr2[i]) != 0) {
return false;
}
}
return true;
}
Эта последняя техника работает, даже если массивы содержат дубликаты. Это делает это O(N log N)
. Он сортирует массивы, переданные в качестве параметров, поэтому, если исходное состояние важно, вы должны передать вместо них clone()
.