2016-03-03 3 views
-3

При условии, что String, моя цель - проверить, могу ли я сделать эту строку палиндровой строкой даже после повторной компоновки символов.Поиск палиндрома String throws StringIndexOutOfBoundsException, возможная причина?

Для например: aaabbbb может быть палиндром путем перехода к: bbaaabb

Так что я стараюсь, чтобы сравнить все перестановки строки с обратным, если он существует, распечатайте ДА! , А вот код до сих пор:

private static void permutation(String prefix, String str) 
{ 
    temp.setLength(0); //temp is a StringBuilder 
    int n = str.length(); 
    if((n==0) && (str.charAt(0)==str.charAt(n-1))) 
    { 
     temp.append(prefix); 
     temp.reverse(); 
     if(prefix.equals(temp.toString())) 
     { 
      System.out.println("YES"); 
      System.exit(0); 
     } 
    } 
    else 
    { 
     for(int i=0;i<n;i++) 
      permutation(prefix+str.charAt(i),str.substring(0,i)+str.substring(i+1,n)); 
    } 
} 

Теперь проблема, во время выполнения я получаю java.lang.StringIndexOutOfBoundsException на этой линии: permutation(prefix+str.charAt(i),str.substring(0,i)+str.substring(i+1,n));

Что может быть, возможно, причиной этого?

+0

Какие шаги вы предприняли для самостоятельной отладки проблемы? –

+0

Это связано с тем, что при i = n-1 подстрока (i + 1, n) станет подстрокой (n, n) ... так как строка индексируется 0. она будет выходить за пределы исключения. –

+1

Вы пытаетесь получить доступ к индексу, который не существует ... также вы можете попробовать - подсчитать буквы в данной строке ... для четного случая каждая буква должна иметь счет '2' и для нечетных случаев - то же самое выполняется, за исключением одной буквы в данной строке. – Tirath

ответ

0

Эта линия даст вам исключение тоже:

if((n==0) && (str.charAt(0)==str.charAt(n-1))) 

Если п == 0, то строка пуста, и Шара (0) потерпит неудачу. Не уверен, что вы здесь тестируете.

1

Я не собираюсь отлаживать это для вас, но я предлагаю вам процесс отладки этого типа самостоятельно.

  1. Определить проблему. Вся деталь о палиндромах не имеет значения. Проблема заключается в вызове java.lang.StringIndexOutOfBoundsException при вызове одного из методов в String.

  2. Суть в том, что именно не удается. В строке, которая не работает, существует несколько вызовов методов. Если не очевидно, какой вызов метода является проблемой, либо одноэтапный переход с помощью отладчика, либо разрыв этой строки на несколько строк, например. путем создания промежуточных переменных для хранения промежуточного состояния.

  3. Воспроизведение проблемы в упрощенном примере. Создайте новый класс с помощью метода main() или напишите модульный тест и напишите код, который показывает проблему. Удалите все, что не является абсолютно необходимым, чтобы показать проблему.

  4. Исправить ваш пример. После того, как вы выделили проблему и прочитайте документацию, вероятно, будет очевидно, как ее исправить. Если это не так, и вы все еще застряли, отправьте простой пример в «Переполнение стека» и объясните, что вы ожидаете и что получаете.

  5. Исправить ваш код. Применить то же исправление к исходному коду.

+0

Хотя мне очень нравится ваш ответ, я не могу его продвигать, потому что он не отвечает непосредственно на вопрос (или так чувствует себя моя кишка). Может быть, вы могли бы ответить на этот вопрос? – Rhayene

0

String index out of bound exception -Этот исключение методами класса Струнный для того, чтобы указать, что индекс либо отрицательный, или больше, чем размер самой строки.

В приведенном выше коде вы вызываете метод permutation() рекурсивно.

Предположим, мы прошли String str="xy" и префикс как "" до permutation() метода в первый раз.

Поскольку длина его больше 0, она будет доходить до блока else. В другом блоке мы зацикливаем str с его длиной.

Здесь длина i.e n is 2. В первом цикле i=0. Таким образом, prefix + str.charAt(i) даст "" + "x" = "x" и str.substring(0,i)+str.substring(i+1,n) даст str.substring(0,0)+str.substring(0+1,2)=""+"y"="y".

Теперь мы передаем эти значения методу permutation(); т.е. permutation("x","y"). Таким образом, время, когда вы прошли эти значения в методе, в то время мгновенно строка str стала "y" и строка префикса стала "x" , но все же вы находитесь в цикле, и во втором цикле i=1 и prefix+str.charAt(1) т.е. "x"+"y".charAt(1) выбросит исключение.

Здесь вы можете увидеть строку str="y", длина 1, и мы пытаемся получить символ в позиции 1. Вот почему вы получили это исключение.

Смежные вопросы