Home > Enterprise >  How to check for palindrome excluding the non-alphanumeric characters?
How to check for palindrome excluding the non-alphanumeric characters?

Time:12-04

Here's the code that I attempted

public String isPalindrome(String s) {


    String trimmed = s.replaceAll("[^A-Za-z0-9]", "");


    String reversed = "";

    int len = trimmed.length();


    for (int i = len - 1; i >= 0; i--) {

        char[] allChars = trimmed.toCharArray();

        reversed  = allChars[i];

    }


    if (trimmed.equalsIgnoreCase(reversed)) {
        return "true";
    } else {
        return "false";
    }

}

Sample Input 1 A man, a plan, a canal: Panama

Sample Output 1 true

Explanation 1 The given string is palindrome when considering only alphanumeric characters.

Sample Input 2 race a car

Sample Output 2 false

Explanation 2 The given string is not a palindrome when considering alphanumeric characters.

CodePudding user response:

Your variable len comes from the length of the String s. But you use the value on the array coming from trimmed.

So if you want to remove the IndexOutOfBoundsException you should change your len declaration to:

int len = trimmed.length();

CodePudding user response:

You can return boolean instead of String:

public static boolean isPalindrome(String s) {
    String trimmed = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();

    int from = 0, to = trimmed.length() - 1;
    while (from < to) {
        if (trimmed.charAt(from) != trimmed.charAt(to)) {
            return false;
        }
        from  ;
        to--;
    }
    return true;
}

CodePudding user response:

You can use StringBuilder to reverse a String:

public static void main(String[] args) {
    String input = "a#b!b^a";
    String clean = input.replaceAll("[^A-Za-z0-9]", "");
    String reverse = new StringBuilder(clean).reverse().toString();
    boolean isPalindrome = reverse.equals(clean);
    System.out.println(isPalindrome);
}

CodePudding user response:

You can do like this in linear time as the loops are driven by the presence of non-alphabetic/digit characters. Also, no trimming or reversal of the string is required.

String[] test =  {"A man,  a plan, a canal: Panama",
         "race a car","foobar", "ABC2CEc2cba"};

for (String s : test) {
     System.out.printf("[ -> %s%n", isPalindrome(s), s);
}

prints

 true ->    A man,  a plan, a canal: Panama 
false -> race a car
false -> foobar
 true -> ABC2CEc2cba 

The outer while loop drives then entire process until the indices cross or are equal. The inner loops simply skip over non-alphabetic/digit characters.

public static boolean isPalindrome(String s) {
    int k = s.length() - 1;
    int i = 0;
    char c1 = '#';
    char c2 = '#';
    while (i <= k) {
        while (!Character.isLetterOrDigit(c1 = s.charAt(i  )));
        while (!Character.isLetterOrDigit(c2 = s.charAt(k--)));
        if (Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
            return false;
        }
    }
    return true;
}
  •  Tags:  
  • java
  • Related