2015-01-17 3 views
1

Я использую простую функцию, чтобы проверить, является ли строка палиндром. Но программа переходит в бесконечный цикл.Проверка, является ли строка палиндром в Java

public static boolean checkPalindrome(String s){ 

     boolean check = true; 
     int mid = s.length()/2; 
     int j = s.length() -1; 
     int i = 0; 
     if (s.length()%2 == 0) { 
      while(i <= mid){ 
       if (s.charAt(i) != s.charAt(j)){ 
        check = false; 
        j--; 
        i++; 
       } 
      } 
     }else if(s.length()%2 != 0){ 
      while(i < mid +1){ 
       if (s.charAt(i) == s.charAt(j)){ 
        check = false; 
        j--; 
        i++; 
       } 
      } 
     } 
     return check; 

    } 
+1

Вы не рассчитывайте 'i' если йор' ', если условие ложно !! – Jens

ответ

-2

Там нет необходимости делать сложные петли, как это. Что-то, как это будет работать:

boolean isPalindrome(String s) { 
    for (int i = 0; i < s.length()/2; i++) { 
     if (s.charAt(i) != s.charAt(s.length() - i - 1)) return false; 
    } 

    return true; 
} 
1

Почему бы не просто сделать:

String rev = new StringBuilder(s).reverse().toString(); 
return rev.equals(s); 

В качестве альтернативы:

int len = s.length(); 
for (int i = 0; i < len; i++) 
    if (s.charAt(i) != s.charAt(len - i - 1)) return false; 
return true; 
+0

Очень красноречивый! Можно также рассмотреть возможность преобразования '.ToUpper()'? – Thomas

+6

Хотя это правда, это не помогает ОП понять его ошибку. Я предпочитаю, если вы можете помочь ему с его * актуальной * проблемой, и только тогда предложите альтернативное решение. – Maroun

+2

@MarounMaroun Я принимаю вашу точку зрения, но вижу: [Что такое проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). OP использует неподходящий метод для решения этой проблемы. Вы бы сделали это только в том случае, если бы вас заставили: например, вопрос о домашнем задании состоял в «использовании цикла while, теста для палиндрома» (и это не было указано) –

4

Вам нужно переместить приращение I и декремента J из внутренней, если условия, и он не будет идти в бесконечный цикл.

+2

Это реальный ответ здесь. –

+0

Действительно .. Из этого ответа ОП поймет, что он сделал не так. – Maroun

+0

Этот ответ верен в ограниченном объеме. По моему мнению (и это всего лишь мнение), истинная ошибка OP заключалась в использовании несоответствующего решения для проверки палиндрома. Зафиксировав цикл while, OP не понял, как правильно решить проблемы, найдя простейшее возможное решение. –

0

Попробуйте следующий код:

public class Palindrome { 
private static Scanner input; 

public static void main(String args[]) { 
    System.out.print("Enter a string:"); 
    input = new Scanner(System.in); 
    String str = input.nextLine(); 

    System.out.println(palindromeLoop(str)); 
    System.out.println(palindromeCheck(str)); 
    System.out.println(palindromeRecursion(str)); 
} 

// Using StringBuffer 
public static String palindromeCheck(String str) { 
    StringBuffer strName = new StringBuffer(str); 
    strName.reverse(); 

    if (strName.toString().equals(str)) { 
     return "The String is a Palindrome"; 
    } else { 
     return "Not a Palindrome!!!"; 
    } 
} 

// Using For-Loop 
public static String palindromeLoop(String str) { 
    String original = str; 
    String reverse = ""; 

    for (int i = str.length() - 1; i >= 0; i--) { 
     reverse = reverse + original.charAt(i); 
    } 

    if (original.equals(reverse)) { 
     return "The String is a Palindrome"; 
    } else { 
     return "Not a Palindrome!!!"; 
    } 
} 

// Using Recursion 
public static String palindromeRecursion(String str) { 
    if (str.length() <= 1) { 
     return "The String is a Palindrome"; 
    } else if (str.charAt(0) != str.charAt(str.length() - 1)) // Base case 
     return "Not a Palindrome!!!"; 
    else 
     return palindromeRecursion(str.substring(1, str.length() - 1)); 
} 
0
class CheckPalindrome { 
    boolean isPalindrome(String text) { 
     int i = 0; 
     int j = text.length() - 1; 
     while (i < j) { 
      while (!Character.isLetter(text.charAt(i)) && i < j) { 
       ++i; 
      } 
      while (!Character.isLetter(text.charAt(j)) && i < j) { 
       --j; 
      } 
      if (Character.toLowerCase(text.charAt(i++)) != Character.toLowerCase(text.charAt(j--))) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 




@Test 
    public void isPalindrome() throws Exception { 

     CheckPalindrome checkPalindrome = new CheckPalindrome(); 
     String text = "No, it is opposition"; 
     assertTrue(checkPalindrome.isPalindrome(text)); 

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