Правила[Одномерные массивы]
66. Дан массив А. Найти отрезок массива максимальной длины, в котором первое число равно последнему, второе – предпоследнему и т.д. Вывести этот отрезок и его длину.
public static void solve(int[] arr) {
int n = arr.length;
int offset = 0; // индекс первого элемента искомого палиндрома
int count = 0; // offset + count = индекс последнего элемента искомого палиндрома
// isPalindrome[o][c] является true, если подпоследовательность,
// начиная с элемента o и заканчивая элементом o + c является палиндромом
boolean[][] isPalindrome = new boolean[n][];
for (int i = 0; i < n; i++) {
// в массиве есть всего n - i подпоследовательностей,
// начинающихся с i-го элемента данного массива
isPalindrome[i] = new boolean[n - i];
// подпоследовательность из одного элемента всегда палиндром
isPalindrome[i][0] = true;
}
// рассмотрим все двухэлементные подпоследовательности
for (int i = 0; i < n - 1; i++) {
if (arr[i] == arr[i + 1]) {
isPalindrome[i][1] = true;
if (count < 1) {
offset = i;
count = 1;
}
}
}
// и остальные подпоследовательности
// c - count, o - offset
for (int c = 2; c < n; c++) {
for (int o = 0; o + c < n; o++) {
// типа рекурсивная функция
// isPal(arr, i, j) = arr[i] == arr[j] && isPal(arr, i + 1, j - 1)
if (arr[o] == arr[o + c] && isPalindrome[o + 1][c - 2]) {
isPalindrome[0][c] = true;
if (c > count) {
offset = o;
count = c;
}
}
}
}
// вывод с arr[offset] по arr[offset + count],
// длина равна count + 1
for (int i = offset; i <= offset + count; i++) {
System.out.printf("%d ", arr[i]);
}
System.out.printf("\n%d\n", count + 1);
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ