Often as a programming exercise, we write code to detect palindromes. A palindrome spells the same word (or sentence) forwards and backwards.
By scanning forward from the start, and backwards from the end of a string
, we can compare the equality of each character. We can ignore spaces and punctuation as we go along.
This code sample introduces 2 methods. In isPalindrome
we tell whether the string
argument is a palindrome. It uses a while-true
loop (with nested loops) to check characters.
Character.isLetter
, advance past non-letter chars—this skips spaces.Character.toLowerCase
to convert uppercase letters to lowercase ones. So "X" and "x" are equal.main()
we test an array of Strings for palindromes. We write our results to console.public class Program { public static boolean isPalindrome(String value) { // Scan towards the middle, adjusting the start and end indexes. int min = 0; int max = value.length() - 1; while (true) { if (min > max) { return true; } // Move forward past non-letter chars at the start. while (!Character.isLetter(value.charAt(min))) { min++; } // Move backward past non-letter chars at the end. while (!Character.isLetter(value.charAt(max))) { max--; } char a = Character.toLowerCase(value.charAt(min)); char b = Character.toLowerCase(value.charAt(max)); // If letters are not equal, this is not a palindrome. if (a != b) { return false; } // Advance towards center. min++; max--; } } public static void main(String[] args) { // Some example lines. String[] lines = { "civic", "A man, a plan, a canal: Panama.", "A Toyota. Race fast, safe car. A Toyota.", "Cigar? Toss it in a can. It is so tragic.", "Dammit, I'm mad!", "Delia saw I was ailed.", "Desserts, I stressed!", "Draw, O coward!", "Lepers repel.", "Live not on evil.", "Lonely Tylenol.", "Murder for a jar of red rum.", "Never odd or even.", "No lemon, no melon.", "Senile felines.", "So many dynamos!", "Step on no pets.", "Was it a car or a cat I saw?", "Dot Net Perls is not a palindrome.", "Why are you reading this?", "This article is not useful." }; // Test each line to see if it is a palindrome. for (String line : lines) { if (isPalindrome(line)) { System.out.println("Palindrome: " + line); } else { System.out.println("Not palindrome: " + line); } } } }Palindrome: civic Palindrome: A man, a plan, a canal: Panama. Palindrome: A Toyota. Race fast, safe car. A Toyota. Palindrome: Cigar? Toss it in a can. It is so tragic. Palindrome: Dammit, I'm mad! Palindrome: Delia saw I was ailed. Palindrome: Desserts, I stressed! Palindrome: Draw, O coward! Palindrome: Lepers repel. Palindrome: Live not on evil. Palindrome: Lonely Tylenol. Palindrome: Murder for a jar of red rum. Palindrome: Never odd or even. Palindrome: No lemon, no melon. Palindrome: Senile felines. Palindrome: So many dynamos! Palindrome: Step on no pets. Palindrome: Was it a car or a cat I saw? Not palindrome: Dot Net Perls is not a palindrome. Not palindrome: Why are you reading this? Not palindrome: This article is not useful.
Often when implementing a palindrome method, non-letter characters are not considered. But when analyzing a sentence, punctuation and spaces usually appear.
string
, with Replace
or a regular expression, to eliminate these characters.isPalindrome
method.When learning a language, I often implement many small methods based on known algorithms. These include a ROT13 cipher and a palindrome-testing method. We can fill in gaps in our knowledge.