Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > трехмерный массив


Автор: silivdar 21.12.2014, 16:49
Привет всем. Срочно нужна помощь! Не мог бы кто-нибудь объяснить подробно и по порядку, что делает этот код? Знаю только саму суть, что он читает строку, находит самые длинные четные и нечетные палиндромы(слова, читающиеся слева направо и справа налево одинаково, например, aabaa или gag), а потом выводит их на экран, при этом там еще выводится его длина и позиция первого символа (считая слева). Заранее спасибо)
Код

public static void palindrom(String s) {
        String str;//promenne
        boolean evenpal, oddpal;
        int k, m, poz, c;
        int n = 0;
        int k1, m1, poz1, c1;
        int n1 = 0;
        int[][][] pal = new int[s.length()][2][3];
        for (int i = 2; i < (s.length() - 2); i++) {
            k = 0;
            c = 1;
            poz = 0;
            evenpal = false;
            oddpal = false;
            if (s.charAt(i) == s.charAt(i + 1)) {
                evenpal = true;
            }
            if (s.charAt(i) == s.charAt(i + 2)) {
                oddpal = true;
            }
            while (evenpal != false) {       //hledame sude palindromy
                if (s.charAt(i - k) == s.charAt(i + c)) {
                    m = poz + 2;
                    k++;
                    c++;
                    poz = m;
                } else {
                    evenpal = false;
                }
            }
            if (pal[0][1][0] < poz) {
                n = 0;
                pal[n][0][0] = i - k + 1;
                pal[n][1][0] = poz;
            }
            if (pal[0][1][0] == poz) {
                pal[n][0][0] = i - k + 1;
                pal[n][1][0] = poz;
                n++;
            }
            k1 = 0;
            c1 = 2;
            m1 = 1;
            poz1 = 0;
            while (oddpal != false) {    //hledame liche palindromy
                if (s.charAt(i - k1) == s.charAt(i + c1)) {
                    m1 = m1 + 2;
                    k1++;
                    c1++;
                    poz1 = m1;
                } else {
                    oddpal = false;
                }
            }
            if (pal[0][1][1] < poz1) {
                n1 = 0;
                pal[n1][0][1] = i - k1 + 1;
                pal[n1][1][1] = poz1;
            }
            if (pal[0][1][1] == poz1) {
                pal[n1][0][1] = i - k1 + 1;
                pal[n1][1][1] = poz1;
                n1++;
            }
        }
        n = 0;
        System.out.println("EVEN_PALINDROM\tMAX_LENTGTH = " + pal[0][1][0]);//vypisujeme sude palindromy
        while (pal[n][1][0] == pal[0][1][0]) {
            str = s.substring(pal[n][0][0], (pal[n][0][0] + pal[0][1][0]));
            System.out.print(pal[n][0][0] + "  " + str);

            System.out.print("\n");
            n++;
        }
        n1 = 0;
        System.out.println("ODD_PALINDROM\tMAX_LENTGTH = " + pal[0][1][1]);//vypisujeme liche palindromy
        while (pal[n1][1][1] == pal[0][1][1]) {
            str = s.substring(pal[n1][0][1], (pal[n1][0][1] + pal[0][1][1]));
            System.out.println(pal[n1][0][1] + "  " + str);
            n1++;
        }

    

Автор: Pawl 6.1.2015, 22:41
Код какой-то мутный: если вводимая строка начинается с палиндрома или заканчивается им, происходит StringIndexOutOfBoundsException в этом месте:
Код

if (s.charAt(i - k) == s.charAt(i + c))

Я бы поискал для себя код получше.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Pomogite-pozhaluysta-trekhmerny-massiv-id5496d048ae2015085d8b4567#findElement_E7045_54ac3a66ae2015a46f8b4957_0

Автор: AntonSaburov 15.2.2015, 15:13
Делать такое через массивы - бред какой-то. Не проще ли строки тупо переворачивать и сравнивать с исходной ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)