D10

KMP algoritmus

http://www2.fiit.stuba.sk/~pospichal/soltis/algo512.htm

http://sekretpoket.blog.matfyz.sk/p16637-vyhladavacie-algoritmy-kmp

public class Retazce {

        /**
         * @param args
         */

        public static void main(String[] args) {
                String retazec = new String("abcdefabcdefghijklabcde");
                String vzorka = new String("abcd");
                najdiVyskyty(retazec, vzorka);
                System.out.println(prefixovySufix("abababa"));
                System.out.println(prefixovySuffix2("abababa"));
        }

        public static void najdiVyskyty(String retazec, String vzorka) {
                int poz = 0;
                int pomoc = 0;
                while (poz <= retazec.length() - vzorka.length()) {
                        int i = 0;
                        while (vzorka.charAt(i) == retazec.charAt(poz + i)) {
                                i++;
                                // System.out.println(i);
                                if (vzorka.length() == i) {
                                        pomoc++;
                                }
                                if (i > vzorka.length() - 1)
                                        break;
                        }
                        poz++;
                }
                System.out.println(pomoc);
        }

        public static int prefixovySufix(String s) {
                int najdlhsiPS = 0;

                for (int i = 0; i < s.length() - 1; i++) {
                        String sub = s.substring(0, i);
                        int dlzka = 0;
                        for (int j = 0; j < sub.length(); j++) {

                                //
                                System.out.println(s.charAt(s.length() - i  + j) + " " +sub);
                                if (s.charAt(j) == s.charAt(s.length() - i  + j)) {
                                        dlzka++;
                                        System.out.println(sub+" "+dlzka);
                                        if (dlzka == sub.length() && dlzka > najdlhsiPS)
                                                najdlhsiPS = dlzka;

                                }
                        }

                }
                return najdlhsiPS;
        }

        public static int prefixovySuffix2(String in) {
                // premenna v ktorej je ulozeny najdlhsi prefixovySuffix
                int zaciatok = 0;
                // dohodli sme sa ze nebude cela dlzka, preto =1
                for (int aktualnyZnak = 1; aktualnyZnak < in.length(); aktualnyZnak++)
                        // ak sa rovnaju znaky, posuniem obidve "znacky"
                        if (in.charAt(aktualnyZnak) == in.charAt(zaciatok)) {
                                zaciatok++;
                                // ak sa nerovnaju, tak, nastavim zaciatok na 1/0, podla toho ci
                                // je rovnaky ako prvy znak
                        } else if (in.charAt(aktualnyZnak) == in.charAt(0))
                                zaciatok = 1;
                        else
                                zaciatok = 0;

                return zaciatok;
        }
        // public static int prefixovySufix(String s) {
        //
        // }
}