class Palyndrom {

    // main Methode zum testen der Klasse
    static public void main(String argv[]) {
        System.out.println( "" );
        System.out.println( "Palyndrom mit Ignore-Case, 24.12.1998 Fabian Wleklinski" );
        System.out.println( "" );


        // Ein paar Tests...

        String s = new String();

        System.out.println( "-) nicht rekursive Loesung" );
        System.out.println( "" );
        s = "abcCBA";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndrom( s ) );
        s = "abcCBX";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndrom( s ) );
        s = "aBCbA";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndrom( s ) );
        s = "AbcBx";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndrom( s ) );

        System.out.println( "" );
        System.out.println( "-) rekursive Loesung" );
        System.out.println( "" );
        s = "abcCBA";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndromR( s ) );
        s = "abcCBX";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndromR( s ) );
        s = "aBCbA";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndromR( s ) );
        s = "AbcBx";
        System.out.println( "  " + s + " ist ein Palyndrom: " + IsPalyndromR( s ) );
    }

    // Diese Methode überprüft, ob ein gegebenen String ein Palyndrom ist, und liefert
    // dementsprechend true oder false zurück
    static public boolean IsPalyndrom( String palyndrom ) {

        boolean error = false;

        // von vorne nach hinten durchgehen, und checken, ob es zu jedem Zeichen am
        // "string-ende" ein äquivalentes gibt
        for (int i=0; i<(palyndrom.length()/2); i++) {

            // beide Zeichen in Großbuchstaben konvertieren (ignore-case Vergleich)
		char c1 = Character.toUpperCase( palyndrom.charAt(i) );
		char c2 = Character.toUpperCase( palyndrom.charAt(palyndrom.length()-i-1) );

            if ( c1 != c2 ) 
                error = true;
        }        
        return !error;
    }

    // Diese Methode entspricht IsPalyndrom, arbeitet aber rekursiv
    static public boolean IsPalyndromR( String palyndrom ) {
        boolean error = false;
        switch (palyndrom.length()) {
            case 0 : 
            case 1 : break;

            default : {
                // beide Zeichen in Großbuchstaben konvertieren (ignore-case Vergleich)
	          char c1 = Character.toUpperCase( palyndrom.charAt(0) );
		    char c2 = Character.toUpperCase( palyndrom.charAt(palyndrom.length()-1) );
                if (c1 == c2) {
                    // wenn erster und letzter Buchstabe gleich, rekursiv den "Mittelpart" checken...
                    error = ! IsPalyndromR( palyndrom.substring(1,palyndrom.length()-1) );
                }
                    else
                {
                    error = true;
                }
            }
        }
        return !error;
    }

}

