2017-02-07 4 views
-1

Ich versuche, ein Programm zu machen, um die Anzahl der Zeichen des längsten Palindrom innerhalb eines Wortes zu finden. Was das Programm tut, ist, alle verschiedenen Teilzeichenfolgen der gegebenen Zeichenkette zu finden und sollte prüfen, ob es ein Palindrom ist und dann die Anzahl der Zeichen, die es hat.Einen String-Index erhalten Außerhalb des Bereichs Fehler

Gerade jetzt ist es richtig, alle möglichen Teil finden und funktioniert, wenn ich eine tatsächliche Palindrom wie hannah eingeben, aber wenn ich Eingang etwas wie banana, bekomme ich folgende Fehler StringIndexOutOfBoundsException.

Hier ist mein Code:

import java.util.Scanner; 

public class Palindrome { 
    public static void main(String[] args) { 

    Scanner sc = new Scanner(System.in); 
    String word; 
    String reverseWord; 
    int palindromeLength = 0; 

    System.out.print("Enter A Word: "); 
    word = sc.nextLine(); 

    reverseWord = new StringBuffer(word).reverse().toString(); 

    if (reverseWord.equals(word)) 
    palindromeLength = word.length(); 

    else { 

     for(int i = 0; i < word.length(); i++) { 

      for(int j = 1; j <= word.length() - j; j++) { 

     String substring = word.substring(i, i + j); 
     String reverseSubstring = new StringBuffer(substring).reverse().toString(); 

     if (reverseSubstring.equals(substring)) { 

     if (substring.length() > palindromeLength) { 

      palindromeLength = substring.length(); 


       } 
      } 
     } 
    } 
} 

    System.out.println(palindromeLength); 

    } 
} 

Wer weiß, warum dies geschieht und wie ich das Problem beheben könnte?

Danke!

+1

'length()' wird die Gesamtzahl der Zeichen in der Zeichenfolge zurück. Sie wollen 'length() - 1 'verwenden, wenn die Schleife ab Index 0 beginnt. – DigitalNinja

+0

für (int j = 1; <= sollte das nicht j = i sein? – onnoweb

+0

@DigitalNinja Immer noch der Fehler – user7455531

Antwort

0

Dies ist, wo die Ausnahme auftritt (weil endIndex größer ist als die Länge der Zeichenfolge ist):

String substring = word.substring(i, i + j); 

Verwenden Sie stattdessen:

String substring = word.substring(i, word.length()); 

Es druckt 5 für „Banane“, die ist das erwartete Verhalten.

+0

Vielen Dank Du, das scheint zu funktionieren, aber es funktioniert nicht mit etwas, das mehrere Palindrome der gleichen Länge hat, wie zum Beispiel "Abracadabra". Irgendeine Idee warum? – user7455531

+0

Ja, ich habe gerade auf Ihre Fragen geantwortet: _Warum das passiert und wie Ich könnte das Problem für Banane beheben. Wie auch immer, der Algorithmus überprüft nicht einmal alle ** möglichen ** Teilstrings der eingegebenen Wörter (die ziemlich viele sind). Aber SO ist keine Plattform, um Algorithmen zu bekommen. –

0

Hier ist meine Lösung:

class Palindrome { 
    public static void main(String[] args) { 
    System.out.println(longestPalindrome("" + 
     "A man once told me, " + 
     "\"A man, a plan, a canal, Panama!\" " + 
     "But what does that mean?")); 
    System.out.println(longestPalindrome("" + 
     "And then he said, " + 
     "\"No 'x' in Nixon\"... " + 
     "Wtf?")); 
    } 

    private static int longestPalindrome(final String word) { 
    assert word != null; 
    final String sanitized = word 
     .replaceAll("\\W", "")//strip non-word chars 
     .toLowerCase(); 
    int currentWinner = 0; 
    for (int i = 0; i < sanitized.length(); i++) { 
     //odd palindromes 
     currentWinner = Math.max(detectPalindrome(sanitized, i, 0, 0), currentWinner); 
     //even palindromes 
     currentWinner = Math.max(detectPalindrome(sanitized, i, 0, -1), currentWinner); 
    } 
    return currentWinner; 
    } 

    private static int detectPalindrome(final String word, 
             final int center, 
             final int currentIndex, 
             final int polarity) { 
    final int left = center - currentIndex; 
    final int right = center + currentIndex + 1 + polarity; 
    if (left >= 0 
     && right < word.length() 
     && word.charAt(left) == word.charAt(right)) { 
     //if you're still on the string and the streak holds, check the next char 
     return (detectPalindrome(word, center, currentIndex + 1, polarity)); 
    } else { 
     //else return the longest found so far 
     return currentIndex * 2 + polarity; 
    } 
    } 
} 
Verwandte Themen