2016-10-08 12 views
-1

回文を使って回文問題を解決しようとしました。私は、スレッド内の例外Main.isPalindromeでjava.lang.String.substringで "メイン" によってjava.lang.StackOverflowError (String.java:1969) (Main.java:160)palindrome StackOverflowエラー

しかし、Iドンを得ましたそれを修正する方法はわかりません。

public static boolean isPalindrome(String s) { 
     int len = s.length(); 
     if (len <= 1) return true; 
     else { 
      char ch1 = Character.toLowerCase(s.charAt(0)); 
      char ch2 = Character.toLowerCase(s.charAt(len - 1)); 
      boolean check1 = Character.isLetter(ch1) || Character.isDigit(ch1); 
      boolean check2 = Character.isLetter(ch2) || Character.isDigit(ch2); 
      if (check1 && check2) { 
       if (ch1 == ch2) { 
        String shorter = s.substring(1, len - 1); 
        return isPalindrome(shorter); 
       } 
       else { 
        return false; 
       } 
      } 
      else if (!check1 && check2) { 
       String shorter = s.substring(1); 
       return isPalindrome(shorter); 
      } 
      else if (!check2 && check1) { 
       String shorter = s.substring(0, len - 1); 
       return isPalindrome(shorter); 
      } 
      else { 
       String shorter = s.substring(1, len - 1); 
       return isPalindrome(shorter); 
      } 
     } 
    } 
+0

ここでは、入力文字列が奇数長になると想定しています。開始ブロックでも長さが2であることを確認し、0番目と1番目の位置でチェックしてください。 –

+0

System.out.printを試しました(isPalindrome( "sb、bbs")); System.out.print(isPalindrome( "、bbs")); System.out.print(isPalindrome( "sbbs")); – sower

+0

しかし、それらのすべてが正しいです – sower

答えて

0

あなたのロジックに間違いはありません。スタックフレームを保持するためのメモリ量が限られているため、再帰レベルの数が限られているだけです。入力文字列が十分大きい場合、StackOverflowErrorがスローされます。

私の提案は、この再帰的な実装を放棄し、代わりにループを使用することです。

+0

はい私はあなたが正しいと思います。ありがとうございました 。 – sower

0

それは、あなたがおそらくメソッド自体と同じ引数で、そしてあなたの再帰を終了するには何が結果的に存在しないことを求めていると述べた160であるラインを正確に知らなくても言うことは難しいです。

関連する問題