LeetCode 125 & LintCode 415
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. Note: For the purpose of this problem, we define empty string as valid palindrome.
**Example1**
Input: "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama"
**Example2**
Input: "race a car"
Output: false
Explanation: "raceacar"
Thinking Mode: Recursive Approach
- Clarification: the string could be numbers and characters. And we need to delete punctuations.
- Using replaceAll method to delete all blank spaces and punctuations.
- Using a helper function to do the recursion instead of using the substring method, which will reduce the time complexity.
- In the helper method, we define two pointers (start and end) to traverse the string to compare the characters util the start is greater than or equal to the end, which means the string is a palindrome.
- Time complexity: O(n)
Graph Illustration : s="race a car"
Java Solution
public class Solution {
/**
* @param s: A string
* @return: Whether the string is a valid palindrome
*/
public boolean isPalindrome(String s) {
if (s.length() == 0 || s == null) {
return true;
}
String words = s.replaceAll("\\p{Punct}", "").replaceAll("\\s","").toLowerCase();
return isPalindromeHelper(words, 0, words.length()-1);
}
private boolean isPalindromeHelper(String words, int startLoc, int endLoc) {
if (startLoc >= endLoc) {
return true;
}
if (words.charAt(startLoc) == words.charAt(endLoc)) {
return isPalindromeHelper(words, startLoc+1, endLoc-1);
}
else {
return false;
}
}
}