// Valid Palindrome - https://leetcode.com/problems/valid-palindrome/
class Solution {
// Time Complexity: O(n)
// Space Complexity: O(n)
// public boolean isPalindrome(String s) {
// s = s.toLowerCase();
// StringBuilder sb = new StringBuilder();
// for(int i = 0; i < s.length(); i++) {
// Character c = s.charAt(i);
// if(Character.isLetterOrDigit(c)) {
// sb.append(c);
// }
// }
// String toCheck = sb.toString();
// int i = 0, j = toCheck.length() - 1;
// while(i < j) {
// if(toCheck.charAt(i) != toCheck.charAt(j)) {
// return false;
// }
// i++;
// j--;
// }
// return true;
// }
// Time Complexity: O(n)
// Space Complexity: O(n)
// Similar to above but compact code
// public boolean isPalindrome(String s) {
// StringBuilder sb = new StringBuilder();
// for(int i = 0; i < s.length(); i++) {
// Character c = s.charAt(i);
// if(Character.isLetterOrDigit(c)) {
// sb.append(Character.toLowerCase(c));
// }
// }
// return sb.toString().equals(sb.reverse().toString());
// }
// Two pointers optimized
// Time Complexity: O(n)
// Space Complexity: O(1)
public boolean isPalindrome(String s) {
int l = 0, r = s.length() - 1;
while (l < r) {
while (l < r && !alphaNum(s.charAt(l))) {
l++;
}
while (r > l && !alphaNum(s.charAt(r))) {
r--;
}
if (Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r))) {
return false;
}
l++; r--;
}
return true;
}
public boolean alphaNum(char c) {
return (c >= 'A' && c <= 'Z' ||
c >= 'a' && c <= 'z' ||
c >= '0' && c <= '9');
}
}