Introduction
This code calculates if a string is a palindrome, and was inspired by the Channel9 video by Gary Daniels and Evan Goldring - Mock whiteboard problem.
Background
There are two main approaches to calculating palindromes: byte symmetry, or on the basis of words. Byte symmetry checks to see if a string is a mirror image of itself "helloolleh", whilst the other approach handles white spaces "Was it Eliot's toilet I saw?"
Using the code
I've not inluded the code as an attachment, rather as inline text that can be used directly.
static bool isPalindrome(string subject)
{
const int STEP_FORWARD = 1;
const int STEP_BACKWARD = -STEP_FORWARD;
const int BEFORE_START = -1;
const int CHAR_AT_A_TIME = 1;
const int COMPARE_EQUALS = 0;
bool result = false;
CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;
CompareOptions co =
CompareOptions.IgnoreCase |
CompareOptions.IgnoreKanaType |
CompareOptions.IgnoreNonSpace |
CompareOptions.IgnoreSymbols |
CompareOptions.IgnoreWidth; |
if (subject != null)
{
int AFTER_END = subject.Length;
result = (AFTER_END == 1 && IsPalindromeChar(subject[0]));
int startOffset = GetNextValidCharacter(subject, BEFORE_START,
STEP_FORWARD, AFTER_END);
int endOffset = GetNextValidCharacter(subject, AFTER_END,
STEP_BACKWARD, BEFORE_START);
while (startOffset < endOffset)
{
result = ci.Compare(subject, startOffset, CHAR_AT_A_TIME,
subject, endOffset, CHAR_AT_A_TIME, co) == COMPARE_EQUALS;
if (!result)
break;
startOffset = GetNextValidCharacter(subject, startOffset,
STEP_FORWARD, endOffset);
endOffset = GetNextValidCharacter(subject, endOffset,
STEP_BACKWARD, startOffset);
}
}
return result;
}
static int GetNextValidCharacter(string subject, int offset,
int step, int bound)
{
if (offset != bound)
offset += step;
while (offset != bound && !IsPalindromeChar(subject[offset]))
offset += step;
return offset;
}
static bool IsPalindromeChar(char c)
{
return char.IsLetter(c) || char.IsDigit(c);
}
Points of interest
Reading the Wikipedia entry on palindromes shows that there are more than just alphabetical palindromes, so it is worth checking with your users before assuming that this code is what they mean by a palindrome.
On my blog, I've also included the byte symmetry code approach.
History
- Aug/2008 - First version.